Autor Zpráva
it47
Profil
Ahojte,

chcel by som do clanku v premennej $text pridat $novy_text po prvom najdenom paragrafe alebo dvojitom novom riadku, t.j. po najdeni </p> alebo <br /><br /> alebo <br><br>. Celé toto nastane iba ak koniec prveho paragragu je po X=1000 znakoch, inak sa nic nove nevlozi.

Vedeli by ste mi prosim vas poradit, ako by som to mohol dosiahnut?

Vopred dakujem velmi pekne.

it47
Keeehi
Profil
$text = '<p>lorem ipsum</p> <p>dolor sit</p>';
$novy_text = 'novy text';

preg_match('~(?:</p>|(?:<br ?/?>){2})~', $text, $matches, PREG_OFFSET_CAPTURE);

if(!empty($matches)) {
    $offset = $matches[0][1] + strlen($matches[0][0]);
    if ($offset > 100) {
        $text = substr($text, 0, $offset).$novy_text.substr($text, $offset);
    }
}

echo $text;
it47
Profil
Keeehi:
super, dakujem velmi pekne.

Len zrejme som zle vysvetlil, ako to chcem: ono hlada prve ukoncenie paragrafu po X znakoch, tj. pri

<p>lorem ipsum</p> <p>dolor sit</p> <p>lorem ipsum</p> <p>dolor sit</p> <p>lorem ipsum</p> <p>dolor sit</p> <p>lorem ipsum</p> <p>dolor sit</p>

by vlozil novy text az po 6 paragrafe (pri X=100)

<p>lorem ipsum</p> <p>dolor sit</p> <p>lorem ipsum</p> <p>dolor sit</p> <p>lorem ipsum</p> <p>dolor sit</p> novy text  <p>lorem ipsum</p> <p>dolor sit</p>

Ako by som prosim Ta vedel zahrnut tuto podmienku do kodu?

Vopred dakujem velmi pekne.

it47
Keeehi
Profil
$text = '<p>lorem ipsum</p> <p>dolor sit</p>';
$novy_text = 'novy text';
 
preg_match('~(?:</p>|(?:<br ?/?>){2})~', $text, $matches, PREG_OFFSET_CAPTURE, 1000);
 
if(!empty($matches)) {
    $offset = $matches[0][1] + strlen($matches[0][0]);
    $text = substr($text, 0, $offset).$novy_text.substr($text, $offset);
}
 
echo $text;
it47
Profil
Keeehi:
super, dakujem velmi pekne. A nemalo by sa radsej pouzit funkcia mb_strlen?

Vopred dakujem velmi pekne.
Keeehi
Profil
it47:
Zrovna u strlen to není potřeba. Žádný z těch znaků co budou vybrány nebude mít víc bajtů. Teoreticky by to bylo potřeba u substr. Ovšem preg_match tak, jak je zapsaný, vrací v offsetu počet bajtů a ne počet znaků. Takže použití substr, které pracuje taky s bajty je tu v pořádku.
V regulárních výrazech existuje modifikátor u, který by se asi měl použít při praci s UTF řetězci. Nevím však, jak se bude v tom případě chovat offset funkce preg_match. Je možné, že se pak přepne z bajtů do znaků. Můžeš to vyzkoušet. Pokud by to tak bylo, pak by bylo dobré to použít a musela by se použít i funkce mb_substr. Jinak takto je to správně. Jen tedy ten limit je 1000 bajtů a ne 1000 znaků. Jde o to, jak moc přesně ti na tom záleží.
it47
Profil
Keeehi:
dakujem za vyborne vysvetlenie, suhlasim, strlen je tu spravne.

Este som to upravil o nasledovne:

1.) pred a po <br> moze byt medzera, oznacuje sa prosim ta medzera v regularnych vyrazoch normalnou medzerou, alebo nejakym specialnym znakom? (pozri kod nizsie)
2.) este som tam doplnil aj offset odzadu, t.j. ak sa nachadza ukoncenie paragrafu prilis na konci celeho textu, tak to nechceme. Spravne som to spravil?
3.) prosim ta este, ta dvojbodka v regularnych vyrazoch co znamena?

Aby si to chapal, ta funkcia ma za ulohu vlozit reklamny banner do clanku, ale tak aby nebol ani prilis na zaciatku, a ani prilis na konci.

Tu je upraveny kod.

preg_match('~(?:</p>|(?: ?<br ?/?> ?){2})~', $text, $matches, PREG_OFFSET_CAPTURE, $char_offset);

    if(!empty($matches)) {
        $offset = $matches[0][1] + strlen($matches[0][0]);

        if(strlen($text) - $offset >= $char_offset_end)
            $text = substr($text, 0, $offset).$ad_code.substr($text, $offset);
    }

Dakujem velmi pekne za pomoc.
Keeehi
Profil
it47:
oznacuje sa prosim ta medzera v regularnych vyrazoch normalnou medzerou
ano

Spravne som to spravil?
Myslím že ano.

ta dvojbodka v regularnych vyrazoch co znamena?
To není jen dvojtečka. Závorky v regulárech označují skupiny. Ty skupiny se pak dostávají do $matches. Pokud se na začátek závorky vloží ?:, takový obsah se pak do $matches nedostane.
it47
Profil
Keeehi:
super, dakujem velmi pekne za super vysvetlenia, si borec. ;-)) Velmi si mi pomohol, vazim si to.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0