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

Yel*_*erg 2 html php regex preg-replace

我正在尝试使用preg_replace来替换

<a href="WWW.ANYURL.COM">DISPLAY_TEXT</a>
Run Code Online (Sandbox Code Playgroud)

<a href="WWW.ANYURL.COM">DISPLAY_TEXT</a>
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

$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);
Run Code Online (Sandbox Code Playgroud)

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

$newString = preg_replace('#&lt;a\ href#','TEST',$string);
Run Code Online (Sandbox Code Playgroud)

然后

&lt;a href=&quot;WWW.ANYURL.COM&quot;&gt;DISPLAYTEXT&lt;/a&gt;
Run Code Online (Sandbox Code Playgroud)

TEST=&quot;WWW.ANYURL.COM&quot;&gt;DISPLAYTEXT&lt;/a&gt;
Run Code Online (Sandbox Code Playgroud)

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

$newString = preg_replace('#&lt;a\ href=#','TEST',$string);
Run Code Online (Sandbox Code Playgroud)

返回原来的不变:

&lt;a href=&quot;WWW.ANYURL.COM&quot;&gt;DISPLAY_TEXT&lt;/a&gt;
Run Code Online (Sandbox Code Playgroud)

我已经在这里待了几个小时,任何帮助将不胜感激.

编辑:上下文中的代码

$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;
}
Run Code Online (Sandbox Code Playgroud)

样本$ story = Lorem ipsum dolor sit amet,consectetur adipiscing elit.<a href="www.google.com">Google</a>Vivamus quis sem felis.Morbi vitae neque ac neque blandit malesuada lobortis坐在amet justo.Donec convallis,nibh ut lacinia tempor,neque felis scelerisque nibh,在nulla的feugiat lectus erat.在et euismod nunc.<pernicious code></code>Pellentesque vitae ante orci,vitae ultrices neque.<a href="www.yahoo.com">Yahoo</a>在非nulla sapien,vestibulum faucibus metus.Fusce egestas viverra arcu,<b>ac</b>sagittis leo facilisis in.Nulla facilisi.

我想只允许像href和bold这样的一些标签作为代码.

mar*_*rio 5

您无需手动更换任何东西.如果这是您的整个输入字符串,则使用html_entity_decode()将转义符转换回<>.


同样,您的正则表达式与示例文本一样正常工作.

你的问题是过早的mysql_real_escape_string()电话.它会"在html中为双引号添加反斜杠,这就是反向转换失败的原因(你的正则表达式没有为查找做好准备\&quot;).

避免这样做.摆脱丑陋的clean_string()黑客和magic_quotes的通过手动建议.您必须插入数据库之前进行数据库转义,而不是更早.(或者更好地使用更简单的PDO和准备好的语句.)

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