在preg_replace中使用regex来匹配html href锚点标记


Using regex in preg_replace to match an html href anchor tag

我正在尝试使用preg_replace来替换

<a href="WWW.ANYURL.COM">DISPLAY_TEXT</a>

带有

<a href="WWW.ANYURL.COM">DISPLAY_TEXT</a>

这是我的代码:

$string = htmlentities(mysql_real_escape_string($string1)); 
$newString = preg_replace('#&lt;a' href=&quot;([^&]*)&quot;&gt;([^&]*)&lt;/a&gt;#','<a href="$1">$2</a>',$string);

如果我做有限的测试,例如:

$newString = preg_replace('#&lt;a' href#','TEST',$string);

然后

&lt;a href=&quot;WWW.ANYURL.COM&quot;&gt;DISPLAYTEXT&lt;/a&gt;

成为

TEST=&quot;WWW.ANYURL.COM&quot;&gt;DISPLAYTEXT&lt;/a&gt;

但是,如果我试图让它也匹配"=",它就好像找不到匹配,即

$newString = preg_replace('#&lt;a' href=#','TEST',$string);

返回原始值不变:

&lt;a href=&quot;WWW.ANYURL.COM&quot;&gt;DISPLAY_TEXT&lt;/a&gt;

我已经做了几个小时了,任何帮助都将不胜感激。

编辑:上下文中的代码

$title = clean_input($_POST['title']);
$story = clean_input($_POST['story']);
function clean_input($string) 
  { 
  if(get_magic_quotes_gpc())
  {
   $string = stripslashes($string);
  }
$string = htmlentities(mysql_real_escape_string($string)); 
$findValues = array("&lt;b&gt;","&lt;/b&gt;");
$newValues = array("<b>", "</b>");
$newString = str_replace($findValues, $newValues, $string);
$newString2 = preg_replace('#&lt;a' href=&quot;([^&]*)&quot;&gt;([^&]*)&lt;/a&gt;#','<a href="$1">$2</a>',$newString);
return $newString2;
}

示例$story=Lorem ipsum悲哀坐amet,consectetur adipiscing elit。<a href="www.google.com">Google</a> Vivamus quis sem felis。这是一个很好的例子。Donec convallis,nibh ut lacinia tempor,neque felis scelerisque nibh,在nulla的feugiat lectus erat。在欧洲。<pernicious code></code> Pellentsque vitae ante orci,vitae ultrices neque。<a href="www.yahoo.com">Yahoo</a>在非nulla sapien,前庭动物群metus。Fusce egestas viverra arcu,<b>ac</b> sagittis leo facilisis in。Nulla facilisi。

我只想让href和bold这样的几个标签作为代码通过。

您不需要手动替换任何内容。如果这是整个输入字符串,那么使用html_entity_decode()将转义转换回<>


同样,正则表达式与示例文本一起正常工作。

您的问题是过早的mysql_real_escape_string()呼叫。它在html中的"双引号中添加了反斜杠,这就是反向转换失败的原因(regex没有准备好查找'&quot;)。

避免这种情况。按照手册的建议,去掉丑陋的clean_string()破解和magic_quotes。必须在插入数据库之前执行数据库转义,而不是更早。(或者更好地使用更简单的PDO和准备好的语句。)

还要避免$newString123变量重复,只需在重写字符串时覆盖已有的变量即可。

您也可以这样做:

$str = "&lt;a href=&quot;WWW.ANYURL.COM&quot;&gt;DISPLAY_TEXT&lt;/a&gt;";
echo "Your html code is thus: " . htmlspecialchars_decode($str);