Нужна переменная ширина отрицательный взгляд за заменой - PullRequest
2 голосов
/ 28 апреля 2010

Я посмотрел на многие вопросы здесь (и на многих других веб-сайтах) и некоторые подсказки, но ни один из них не дал мне однозначного ответа. Я знаю регулярные выражения, но я далеко не гуру. Этот конкретный вопрос касается регулярных выражений в 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 и класс в гиперссылках. Я придумал

((?<!<a .*class="no_check".*>)\belephant\b)

, который прекрасно работает в тестовом программном обеспечении regex, но не в PHP.

Любая помощь очень ценится. Если вы не можете предоставить регулярное выражение, но можете найти какую-то логику кода PHP, которая обойдёт его необходимость, я был бы в равной степени признателен.

Ответы [ 3 ]

1 голос
/ 28 апреля 2010

Я думаю, что самый простой подход - это сопоставить либо полный <a> элемент с атрибутом "no_check", или искомое слово. Например:

<a [^<>]*class="no_check"[^<>]*>.*?</a>|(\belephant\b)

Если это было слово, которое вы выбрали, оно будет в группе захвата # 1; если нет, эта группа должна быть пустой или нулевой.

Конечно, под "самым простым подходом" я действительно имел в виду самый простой подход regex . Еще проще было бы использовать анализатор HTML.

1 голос
/ 06 мая 2010

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

Идея использования HTML-парсера была хорошей, хотя в настоящее время я использую один в другом проекте. Так что снимаю шляпу перед Аланом Муром и Эриком Стромом за предложение этого решения.

1 голос
/ 28 апреля 2010

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

Но вам лучше использовать HTML-парсер.

...