2013-11-30 2 views
1

Я использую это регулярного выражениеРегулярного выражения в PHP для тега привязки

(preg_replace("/\bany word\b/", `"<a href="[email protected]">any word</a>"` , 
$content)) 

в моем коде, это для замены данного ключевого слова с заданным тегом привязки, но если уже имеется ссылка в $content то это не изменило бы ключевое слово или ссылку на новую ссылку! Для этого я использовал

(preg_match("/\A<a\s.+>.*\banyword\b.*<\s*\/a\s*>\z/", $content)) 

но если внутри $content есть много ключевых слов с тем же именем, а некоторые ссылки и некоторые другие не ссылаются, то как я заменяю, что ключевые слова с ссылкой.

+0

Эта проблема решена много раз здесь, на этом сайте. Поиск. –

+0

Вы обрабатываете контент во много раз? иногда ссылки устанавливаются в скрипте и/или иногда замена проходит 2 раза? контент поступает из разных источников, но все проходит через один и тот же фильтр? он задает вопрос, и я молюсь за ответ. – hanzo2001

+0

Да, я обрабатываю контент много раз, на самом деле, если в содержании есть несколько ключевых слов, некоторые из них находятся в теге привязки, а некоторые - простые ключевые слова, тогда я хочу, чтобы вместо ключевых слов внутри привязывающего тега заменялись только ключевые слова, например «как вы «'care'« твоя семья тоже заботится », теперь я хочу, чтобы заменялся только второй« уход »не« уход »первого якоря – Adeel

ответ

0

Вам нужно отрицательно смотреть вперед и заглянуть назад, чтобы решить эту проблему. Взгляните на главу Assertions в руководстве по PHP.

Вы используете уже отрицательный взгляд вперед и оглядываетесь на использование оператора границы слова \b. Граница слова - это символ без слова, за которым следует символ слова или символ слова, за которым следует символ без слова. Все символы не записываются.

(?:\w)(?=\W)|(?:\W)(?=\w) 

Но вам не нужны границы слов. Вы должны соответствовать строке, которая не является частью привязки. Не являясь частью якорного средства, не должно быть закрывающего якорного тега или второй половины строки, за которым следует якорный текст и закрывающий тег привязки. Оно выражается этим регулярным выражением:

<? 
$content = 'Send it to abc. <a href="[email protected]">abc</a> needs it.'; 

$content = preg_replace ('/(abc)(?!([^\"]*\">[^<]*)?<\/a>)/', 
      '<a href="[email protected]">$1</a>', 
      $content); 
echo $content, "\n"; 
?> 

Этот сценарий будет генерировать следующий вывод:

$ php look-around.php 
Send it to <a href="[email protected]">abc</a>. <a href="[email protected]">abc</a> needs it. 

Он заменит только первый abc. Для вашего якоря вы должны сделать это наоборот.

+0

, он отлично работает в вышеуказанном состоянии, но не в это условие $ content = 'Отправить в abc. my abc нуждается в этом. '; – Adeel

+0

Что я делаю, если в теге якоря есть более одного слова ??? – Adeel

+0

@Adeel "abc" - уникальный идентификатор. «Мой abc» не может быть в якорный текст, если якорь создан из «abc». Если вам нужно сделать больше одной замены, вам нужно выполнить 'preg_replace' для каждого из них. – ceving

Смежные вопросы