【问题标题】:Add id attribute to hyperlinks through PHP Regular Expressions通过 PHP 正则表达式为超链接添加 id 属性
【发布时间】:2011-12-03 03:28:11
【问题描述】:

我对正则表达式还是比较陌生,感觉我的代码太贪心了。我正在尝试将 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 标签,但它会破坏超链接。例如:

如果原码是:&lt;a href="http://www.google.com"&gt;Link&lt;/a&gt;

而不是&lt;a id="class" href="http://www.google.com"&gt;Link&lt;/a&gt;

这是给予 &lt;a id="class" href="http"&gt;Link&lt;/a&gt;

有什么建议或想法吗?

【问题讨论】:

  • id 属性必须是唯一的。你应该使用preg_replace_callback而不是先匹配然后使用preg_replace
  • 你没有要求它,并且对于输出修改它通常是愚蠢的,所以评论:如果没有正则表达式,这会更简单,例如查询路径htmlqp($html)-&gt;find("a") FOREACH attr("id", "buttonRed".($i++));

标签: php class href preg-match-all


【解决方案1】:

不要使用正则表达式来解析 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 虽然对于这个特定的任务可能不是必需的,但 DOM 解析通常是 DOM 修改的最佳选择——尤其是代替正则表达式。
【解决方案2】:

你的正则表达式有些过于复杂了 :)

此外,也不需要循环,因为 preg_replace() 将命中相关字符串中搜索模式的所有实例。下面的第一个正则表达式将获取 a 标签中的所有内容,并在末尾添加 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>";

【讨论】:

  • 这确实有效,但不会影响其他标签。例如,如果设置了 target="_blank"。它仍然会达到相同的结果吗?这些是用户生成的链接,如果设置了目标,我想确保它不会受到影响。
  • 正则表达式在 a 标签中采用 everything 并简单地添加 id="class" 属性。您是否希望捕获 href 属性?
  • 为了澄清我想单独保留链接,但在请求的字符串中的每个链接上添加要设置为 class 的 id 属性。
  • 你应该使用对你有用的和你觉得舒服的——DOM 比正则表达式更健壮,而且处理器密集度通常更少……但正如 Ralph Waldo Emerson 所说,“一个愚蠢的一致性是小头脑的妖精”
【解决方案3】:

您的第一个子模式 ([\w.-]*): 不匹配,因此它在“http”处停止。

您不能为此使用简单的str_replace() 吗?如果这就是你正在做的一切,正则表达式似乎有点矫枉过正。

$str = str_replace('<a ', '<a id="someID" ', $str);

【讨论】:

  • 问题是这些是用户生成的链接。例如,如果他们设置了 target="_blank" 它会被单独留下吗?我对 preg_match 比较陌生,但我想确保脚本不会过于聪明,我猜只是替换每个完全匹配?
  • @wiseman7687 是的,在我上面的例子中,你只影响了&lt;a 部分。之后的一切都将保持不变。
猜你喜欢
  • 2015-07-07
  • 2012-12-01
  • 2011-10-01
  • 1970-01-01
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
相关资源
最近更新 更多