用regex替换anchor href值

时间:2014-11-16 20:37:42

标签: php regex

我试图通过在href值之前添加我网站的网址来替换网页中锚元素的所有href值。

在你建议使用XML / HTML解析器之前,请知道我尝试了很多它们,并且它们做得很好,但是它们都会返回HTML,而这些HTML只是搞砸了我试图尝试的一些网站解析。这可能与首先编写的破坏的html有关,但由于我无法控制它,正则表达式是唯一的方法。所以我提出了这个代码:

$response = '<h2><a href="http://www.google.com/test">Link</a></h2>';
$pattern = "/(<a .*?href=\"|')([^\"'#]+)(.*?<\/a>)/i";
$response = preg_replace_callback($pattern, 'html_href',  $response);
function html_href($matches) {
    return  $matches[1] . "http://example.com/" . $matches[2] .  $matches[3];
}

它实际上将$response更改为:

<h2><a href="http://example.com/http://www.google.com/test">Link</a></h2>

太棒了。但后来我发现这个正则表达式在某种程度上与此匹配:

$response = "var href = $(this).attr('rel'); $(this).replaceWith('<a href=\"' + decodeURL(href) + '\"><span>' + anchor+ '</span></a>');";
$pattern = "/(<a .*?href=\"|')([^\"'#]+)(.*?<\/a>)/i";
$response = preg_replace_callback($pattern, 'html_href',  $response);
function html_href($matches) {
        return  $matches[1] . "http://example.com/" . $matches[2] .  $matches[3];
 }

这里$ response变为:

var href = $(this).attr('http://example.com/rel'); $(this).replaceWith('<a href="' + decodeURL(href) + '"><span>' + anchor+ '</span></a>');

我真的不知道,为什么这个内部attr()方法匹配并被替换?这个正则表达式模式是不是只匹配以<a开头的字符串部分?我想避免在javascript中匹配内容......

2 个答案:

答案 0 :(得分:0)

只是一些常见方法:

  • 首选<a\s+代替<a␣

  • 此后使用[^<>]*代替.*?进行标记内属性跳过。 (这可能是它在其他地方完全匹配JavaScript的主要原因。)

  • 如果您想允许"'使用字符类[\"\'],就像在中间使用一样。

  • 例如,将href =内容更严格地与([^<\"\'>]+)匹配。

  • 然后确保其他[\"\']到来。

  • 并使用<a声明[^<>]*>标记的结尾(这可能是与所需标记/链接不匹配的另一个主要罪魁祸首)。

再次使用[^<>]+作为链接文本,如果它一致地适合您的输入html。 Protip:尽可能用高级/x表示法编写这样的正则表达式模式。

答案 1 :(得分:0)

试试这个

<强> PHP

$re = "/(<a.*href=)[\"'](.*)[\"']/m";
$str = "<h2><a href=\"http://www.google.com/test\">Link</a></h2>2014-54-22 22:23";
$subst = "\1\"http://example.com/\2\"";

$result = preg_replace($re, $subst, $str);

live demo