Intereting Posts

Preg Replace – заменить второе появление соответствия

Я относительно новичок в php и надеюсь, что кто-то может помочь мне с заменой регулярного выражения, или, может быть, заменить матч, я не совсем уверен.

Я хочу автоматически выделять (второе появление совпадения), а затем сделать четвертое появление курсивом курсивом, а затем обозначить 7-й вид матча.

Это в основном для целей SEO в контенте.

Я сделал некоторые замены: и думал, что это должно сделать трюк?

preg_replace( pattern, replacement, subject [, limit ]) 

Я уже знаю слово, которое хочу использовать в

 'pattern' is also a word that is already defined like [word]. `replacement` 'This is a variable I am getting from a mysql db. 'subject' - The subject is text from a db. 

Допустим, у меня есть это содержание: Это объясняет более или менее то, что я хочу сделать.

Это пример текста, который я хочу заменить. В этом тексте я хочу сделать второе появление слова <bold. Затем я хочу пропустить следующий пример, который появляется в тексте, и сделать четвертый раз, когда пример слова отображается курсивом. Затем я хочу пропустить пятый раз, когда в тексте появится слово example, а также в шестой раз и, наконец, хочет сделать пример 7-го раза в тексте, подчеркнуть его. В этом примере я использовал гиперссылку как пример подчеркивания, так как не вижу в текстовом редакторе функции подчеркивания. Пример слова может появляться больше раз в тексте, но мое единственное требование – подчеркнуть один раз, сделать полужирным один раз и сделать курсив один раз. Позднее я смогу сделать некоторые цитаты из слова «пример», но это еще не приоритет.

Также важно, чтобы код не прошел через ошибку, если не было по крайней мере 7 событий слова.

Как бы я это сделал, любые идеи были бы оценены.

Вы можете использовать preg_split чтобы разделить текст на совпадения, применить модификации и затем сместить все вместе:

 $parts = preg_split('/(example)/', $str, 7, PREG_SPLIT_DELIM_CAPTURE); if (isset($parts[3])) $parts[3] = '<b>'.$parts[3].'</b>'; if (isset($parts[7])) $parts[7] = '<i>'.$parts[7].'</i>'; if (isset($parts[13])) $parts[13] = '<u>'.$parts[13].'</u>'; $str = implode('', $parts); 

Формула индекса для i-го совпадения имеет индекс = i · 2 – 1.

Само регулярное выражение не может рассчитывать, а функции preg_ мало помогают. Вам нужно обходное решение. Если бы вы действительно искали только слово, вы можете использовать строковые функции. В противном случае попробуйте:

 // just counting if (7 >= preg_match_all($pattern, $subject, $matches)) { $cb_num = 0; $subject = preg_replace_callback($pattern, "cb_ibu", $subject); } function cb_ibu($match) { global $cb_num; $match = $match[0]; switch (++$cb_num) { case 2: return "<b>$match</b>"; case 4: return "<i>$match</i>"; case 7: return "<u>$match</u>"; default: return $match; } } 

Фокус в том, чтобы иметь обратный вызов, который делает учет. И там довольно легко добавить какие-либо правила.

Это интересный вопрос. Моей реализацией будет:

 function replace_exact($word, $tag, $string, $limit) { $tag1 = '<'.$tag.'>'; $tag2 = '</'.$tag.'>'; $string = str_replace($word, $tag1.$word.$tag2, $string, 1); if ($limit==1) return $string; return str_replace($tag1.$word.$tag2,$word,$string,$limit-1); } 

Используйте его так:

 echo replace_exact('Example', 'b', $source_text, 2); echo replace_exact('Example', 'i', $source_text, 4); 

Я не знаю, как быстро это будет работать, но будет быстрее, чем preg_replace.