我试图通过在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中匹配内容......
答案 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);