Добавить атрибут id к гиперссылкам через регулярные выражения PHP - PullRequest
0 голосов
/ 02 декабря 2011

Я все еще относительно новичок в регулярных выражениях и чувствую, что мой код слишком жадный. Я пытаюсь добавить атрибут id к существующим ссылкам в куске кода. Мои функции таковы:

function addClassHref($str) {
//$str = stripslashes($str);
$preg = "/<[\s]*a[\s]*href=[\s]*[\"\']?([\w.-]*)[\"\']?[^>]*>(.*?)<\/a>/i";
preg_match_all($preg, $str, $match);
foreach ($match[1] as $key => $val) {
    $pattern[] = '/' . preg_quote($match[0][$key], '/') . '/';
    $replace[] = "<a id='buttonRed' href='$val'>{$match[2][$key]}</a>";
}
return preg_replace($pattern, $replace, $str);
}

Это добавляет тег id, как я хочу, но нарушает гиперссылку. Например:

Если исходный код: <a href="http://www.google.com">Link</a>

Вместо <a id="class" href="http://www.google.com">Link</a>

Это дает <a id="class" href="http">Link</a>

Есть предложения или мысли?

Ответы [ 3 ]

2 голосов
/ 02 декабря 2011

Не используйте регулярные выражения для разбора XML или HTML.

$doc = new DOMDocument();
$doc->loadHTML($html);
$all_a = $doc->getElementsByTagName('a');
$firsta = $all_a->item(0);
$firsta->setAttribute('id', 'idvalue');
echo $doc->saveHTML($firsta);
1 голос
/ 02 декабря 2011

Ваш первый подшаблон ([\w.-]*) не соответствует :, поэтому он останавливается на "http".

Не могли бы вы просто использовать для этого простой str_replace()?Regex кажется излишним, если это все, что вы делаете.

$str = str_replace('<a ', '<a id="someID" ', $str);
1 голос
/ 02 декабря 2011

У вас есть некоторые осложнения в вашем регулярном выражении:)

Кроме того, цикл не нужен, так как preg_replace () попадет во все экземпляры шаблона поиска в соответствующей строке. Первое регулярное выражение ниже возьмет все в тег и просто добавит атрибут id в конце.

$str = '<a href="http://www.google.com">Link</a>' . "\n" .
'<a href="http://www.yahoo.com">Link</a>' . "\n" .
'<a href="http://www.microsoft.com">Link</a>';

$p = "{<\s*a\s*(href=[^>]*)>([^<]*)</a>}i";
$r = "<a $1 id=\"class\">$2</a>";

echo preg_replace($p, $r, $str);

Если вы хотите захватить только атрибут href , вы можете сделать следующее:

$p = '{<\s*a\s*href=["\']([^"\']*)["\'][^>]*>([^<]*)</a>}i';
$r = "<a href='$1' id='class'>$2</a>";
...