Я рассмотрел многие вопросы здесь (и многие другие веб-сайты), а некоторые предоставили намеки, но никто не дал мне окончательного ответа. Я знаю регулярные выражения, но я далек от того, чтобы быть гуру. Этот конкретный вопрос касается регулярного выражения в PHP.
Мне нужно найти слова в тексте, который не окружен гиперссылкой данного класса. Например, я мог бы
This <a href="blabblah" class="no_check">elephant</a> is green and this elephant is blue while this <a href="blahblah">elephant</a> is red.
Мне нужно было бы сопоставлять со вторым и третьим слонами, но не с первым (идентифицированным тестовым классом «no_check»). Обратите внимание, что в гиперссылках может быть больше атрибутов, чем только href и class. Я придумал
((?<!<a .*class="no_check".*>)\belephant\b)
который прекрасно работает в тестовом программном обеспечении regex, но не в PHP.
Любая помощь приветствуется. Если вы не можете предоставить регулярное выражение, но можете найти какую-то логику кода PHP, которая обошла бы ее необходимость, я был бы в равной степени благодарен.
Если отрицательный внешний вид переменной ширины недоступен, быстрое и грязное решение состоит в том, чтобы поменять строку в памяти и вместо этого использовать отрицательный внешний вид переменной ширины. затем снова измените строку.
Но вам может быть лучше использовать парсер HTML.
Я думаю, что самый простой подход состоял бы в том, чтобы сопоставить либо полный элемент <a>
с атрибутом no_check, либо слово, которое вы ищете. Например:
<a [^<>]*class="no_check"[^<>]*>.*?</a>|(\belephant\b)
Если бы это было слово, которое вы соответствовали, оно будет в группе захвата # 1; если нет, эта группа должна быть пустой или пустой.
Конечно, по «простейшему подходу» я действительно имел в виду простейший подход к регулярному выражению . Еще проще было бы использовать парсер HTML.
Я закончил тем, что использовал смешанное решение. Оказывается, мне пришлось анализировать текст для определенных ключевых слов и проверять, были ли они уже частью ссылки, и если не добавить их в гиперссылку. Решения, представленные здесь, были очень интересными, но не совсем подходящими для того, что мне было нужно.
Идея использования парсера HTML была хорошей, хотя в настоящее время я использую один в другом проекте. Так что шляпы уходят как Алану Муру, так и Эрику Стром за предложение этого решения.