Получение содержимого значения href - PullRequest
0 голосов
/ 28 октября 2011

Мне нужно поймать содержимое href с помощью регулярных выражений. Например, когда я применяю правило к href = "www.google.com", я хотел бы получить www.google.com. Кроме того, я хотел бы игнорировать все hrefs, которые имеют только # в своем значении.

Теперь, я играл некоторое время, и я придумал это:

href=(?:\"|\')((?:[^#]|.#.|.#|#.)+)(?:\"|\')

Когда я пробую его в http://www.rubular.com/, он работает как шарм, но мне нужно использовать его с preg_replace_callback в PHP, и там я не получаю ожидаемый результат (для тестирования в PHP использовал этот сайт: http://www.pagecolumn.com/tool/pregtest.htm).

В чем здесь моя ошибка?

Ответы [ 3 ]

9 голосов
/ 28 октября 2011

Поскольку анализ HTML с использованием регулярных выражений - это Bad Thing ™ , я предлагаю менее грубый метод:

$dom = new DomDocument;
$dom->loadHTML($pageContent);

$elements = $dom->getElementsByTagName('a');

for ($n = 0; $n < $elements->length; $n++) {
    $item = $elements->item($n);
    $href = $item->getAttribute('href');
    // here's your href attribute
}
1 голос
/ 28 октября 2011

Прежде всего: НЕ ИСПОЛЬЗУЙТЕ РЕГЕКС ДЛЯ РАЗДЕЛЕНИЯ HTML


Я бы сказал что-то вроде:

href=("|')?([^\s"'])+("|')?
1 голос
/ 28 октября 2011

Как насчет:

href\s*=\s*"([^#"]+#?[^"]*)"
...