为什么错误的url是从我的字符串提取


why wrong url is extracting from my string

如果这是字符串

     $str = 'this is a string of chars <a href="http://www.asd.com'">Anchor Text</a>';
我正在使用这个方法来清理输入
     $res = get_magic_quotes_gpc() ? stripslashes($str) : $str;
     $res = mysql_real_escape_string($res);

和下面的代码提取url

   preg_match('#href's*?='s*?[''"]?([^''"]*)[''"]?#i', $input, $captures);                
   $href = $captures[1];

但是我得出了这个结果

   "'"http://www.asd.com'""

包含两个双引号和反斜杠的字符串。

我想要的地方

http://www.asd.com

简单地说,不要使用regexp。创建需要很长时间,调试需要更长的时间。

$str = 'this is a string of chars <a href="http://www.asd.com'">Anchor Text</a>';
$start = strpos($str, '<a href="') + strlen('<a href="');
$end = strpos($str, '">', $start);
substr($str, $start, $end-$start);
http://codepad.org/w370PJoz

此代码有效。纠正引号

  $str = 'this is a string of char''s <a href="http://www.asd.com">Anchor Text</a>';
  $res = get_magic_quotes_gpc() ? stripslashes($str) : $str;
  $res = mysql_real_escape_string($res);
  preg_match('#href's*?='s*?[''"]?([^''"]*)[''"]?#i', $str, $captures);                
  $href = $captures[1];
  echo $href;

为什么从我的字符串

提取错误的url

因为你写的代码没有按你期望的方式执行。只是因为你想让代码做你想让它做的事情,它才没有这样做。

你需要做的是按照你想要的方式来编写(而不仅仅是想要)代码。这是一件很普遍的事情,想要不适合代码,但写可以。

在您的示例中,代码有错误,因此无法执行。这是非常致命的,PHP在这里甚至拒绝继续

想象你开车过桥,因为你想到达河的另一边。

桥的中间断了,所以你把车开进水里。

在这种情况下,

PHP就是你。它会让你的代码进入天堂,它会像掉进河里一样停止。一切都完了。

所以在你再次开车到河的另一边之前,桥需要修好,因为你仍然想要,而且你已经知道你已经掉进了水里。

所以你在调试模式下启动汽车,以找出桥梁断裂的地方。如果桥梁有多处断裂,你需要多次修复桥梁。PHP有这样一个调试模式,它会告诉您运行时遇到的错误。如果有多个致命错误,它将只告诉您第一个致命错误。所以你可能需要在调试模式下驾驶多次才能最终通过河。

要在调试模式下启动PHP,只需在脚本开头输入以下命令:

error_reporting(~0); ini_set('display_errors', 1);

您可以在PHP手册中了解更多关于错误报告和调试相关操作的信息。这一行将启用报告所有类型的错误,并将确保显示错误。

使用显示给您的信息来修复代码中的错误。同样,PHP手册包含了如何编写PHP脚本的各种信息,包括如何格式化字符串以及特定函数的功能,如何调用它以及它返回的数据类型。

只要修复你遇到的每一个错误,最终你将到达桥的另一边,而不再需要调试模式。然后,您可以禁用调试模式,并确信您已经安全驾驶。

下次你再遇到问题时,你知道你需要做什么:只要再次打开调试模式并修复桥。

使用正则表达式不是解析(x)html字符串的方式。使用php的DOM类:

$domd = new DOMDocument();
libxml_use_internal_errors(true);
$domd->loadHTML(file_get_contents("http://google.com"));
libxml_use_internal_errors(false);
$urls = array();
foreach ($domd->getElementsByTagName("a") as $link) {
  $urls[] = $link->getAttribute("href");
}
var_dump($urls);

这将创建并转储一个数组,该数组包含原始字符串(在本例中为google.com)中的所有href属性。