регулярные выражения - сопоставьте все якоря с необязательными атрибутами - PullRequest
7 голосов
/ 27 октября 2008

У меня есть редактор wysiwyg в моей задней части, и он запускает первое регулярное выражение, которое я написал. Это в PHP4, используя preg_replace(). Я фиксирую URI и связанный текст.

@<a\shref=\"http[s]?://([^\"]*)\"[]>(.*)<\/a>@siU

Клиент хотел, чтобы все внешние ссылки открывались в новом окне, поэтому я использовал это выражение для поиска всех (надеюсь) внешних ссылок, но оставил внутренние ссылки на страницы и т. Д.

Я понял, что редактор wysiwyg также добавляет style="font-weight: bold", если пользователь выбирает жирный шрифт на ссылке. Я только недавно начал изучать регулярные выражения, поэтому я не уверен, как решить эту проблему.

Как бы я это сделал?

1 Ответ

7 голосов
/ 27 октября 2008

это должно соответствовать это хорошо:

/<a\s+([^>]*)href="https?:\/\/([^"]*)"(.*?)>(.*?)<\/a>/

Полезная вещь - ленивый матч. *? это означает, что он будет совпадать только с тем количеством, которое ему абсолютно необходимо, в отличие от обычного совпадения, которое является жадным.

Для демонстрации с этим текстом:

a b c d a b c d

эти регулярные выражения будут иметь разные результаты:

/a.*c/    selects: "a b c d a b c"
/a.*?c/   selects: "a b c"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...