Я относительно новичок в 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.