Текст соответствия PHP RegEx НЕ в теге привязки

1

Regex немного над моей головой, но я пытаюсь учиться.

У меня есть рабочее регулярное выражение, которое я использую в preg_replace, чтобы соответствовать строке и заменить ее ссылкой html. Он правильно избегает, когда совпадения находятся внутри тегов привязки, если в теге привязки нет дочернего тега.

Здесь (обновленный) шаблон:

/(?!(?:[^<]+>|[^>]+<\/a>))\b(Match Me)\b/is

И некоторый образец текста:

<a href="#">Don't Match Me <span>web</span></a>
<a href="#">Don't Match Me</a>
Match Me
<span>Match Me</span>

Вышеупомянутое регулярное выражение будет соответствовать тексту на 1-й, 3-й и 4-й строках. Тем не менее, я хочу только совместить текст "Match Me" на 3-й и 4-й строках.

ПРИМЕЧАНИЕ. Содержимое, которое я просеиваю, не просто разделяется линиями, как в моем примере. Это абзац текста.

Я открыт для использования DOM, но я беру большой блок контента и применяю несколько замен, используя функцию массива preg_replace, например:

preg_replace($searchFor, $linkArray, $content);

где $ searchFor и $ linkArray - это многомерные массивы с соответствующими ключами, содержащими шаблон и замену html соответственно.

Любая помощь приветствуется!

  • 0
    Вы хотите соответствовать целой 4-й линии? или просто "Соедини меня"?
  • 0
    Является ли набор тегов, которые обернут 'Foo Bar' конечным? Это просто <span> .... </ span> или это могут быть другие теги, такие как <em>, <strong>, <b> и т. Д.? Предполагается ли принимать во внимание недопустимый или небрежный html, например: <span> foo bar </ div>, или такие вещи, как <h2> foo bar </ h2>?
Показать ещё 2 комментария
Теги:

3 ответа

1
Лучший ответ

Совпадение HTML довольно сложно с регулярным выражением. В принятом ответе здесь не учитываются строки, где совпадение находится между двумя отдельными тегами привязки, например:

HTML:

<a href="#">Don't Match Me <span>web</span></a>
match me
<a href="#">Don't Match Me</a>match me<a href="#">Don't Match Me</a>

Раньше я использовал следующее regex, но это будет работать только в php: https://regex101.com/r/v0FfFC/1

  • 1
    Спасибо, что еще раз посмотрел на это. Вы были правы в отношении установки между двумя якорями. Для процветания это регулярное выражение /<a[^>]*>(?:[a-zA-Z0-9\s'\-\.,]|(?:<(.*)>.*<\/\1>))*<\/a>(*SKIP)(*FAIL)|\b(match me)\b(?=[^>]*(?:<|$))/gi
  • 0
    Спасибо, возможно, потребуется настроить для индивидуальных случаев использования
1

Обновите комментарий, чтобы ответить:

match me(?!.*?\<\/a\>) 

https://regex101.com/r/hH3rL1/1

  • 0
    Это принятый ответ, но он не работает на моем движке регулярных выражений (Sublime Text 2) ... он соответствует всем строкам.
  • 0
    Однако это не работает, если <a href="#">Don't Match Me</a> match me <a href="#">Don't Match Me</a> совпадение находится между двумя тегами привязки, т. <a href="#">Don't Match Me</a> match me <a href="#">Don't Match Me</a>
0

Я изменил ваше регулярное выражение, чтобы найти якоря и избежать выбора этой строки.

/^(?!.*(\<a.*?\>)).*$/ism

https://regex101.com/r/kE4mJ0/1

  • 0
    Mayo- большое спасибо за то, что взглянули на это. Я думаю, я не был кристально чистым. Это не обязательно в отдельных строках, это может быть <a href="#"> Не подходить мне <span> Интернет </ span> </a> <a href="#"> Не надо t Match Me </a> Match Me <span> Match Me </ span>. И мне нужно иметь возможность сопоставлять конкретный текст «Match Me» ... если только он не находится внутри тега привязки.
  • 1
    соответствовать мне (?!. *? \ <\ / a \>), это работает для проблемы с yopur?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню