您的代码
$matches = array();
$search="domain.com";
preg_match('|(<a\s*[^>]*href=[\'"]?)|',$prod['value'],$matches);
echo '<p>'.$matches[1].'</p>';
首先,$matches 不需要在 preg_match 调用之前定义。您只需要提供一个变量名,PHP 就不会引发通知。
其次,$search 似乎与问题无关?..
第三...请记住,您尚未显示示例输入,我将假设您实际上想要preg_match_all,以便您可以获得所有@的列表987654328@ 来自输入。
第四,继三个之后,这意味着您需要var_dump 或print_r 而不是echo,因为$matches[X] 的内容将是array。
正则表达式
好的,现在看看你的正则表达式模式实际上做了什么......
(<a\s*[^>]*href=['"]?)
-
( - 启动捕获组
-
<a\s* - 匹配 <a 后跟 0 个或更多 个空格字符
-
[^>]* - 匹配 0 个或更多 个不是 > 的字符
-
href= - 匹配 href=
-
['"]? - 可选匹配 ' 或 "
-
) - 结束捕获组
这一切都意味着,针对 示例输入,您的正则表达式将匹配第一个链接示例 (google) 中的 <a href=" 和第二个链接示例 (youtube) 中的 <a class="fancyStyle" href="。
/**
Output from:
preg_match_all('|(<a\s*[^>]*href=[\'"]?)|', $string, $matches);
var_dump($matches);
*/
array(2) {
[0]=>
array(2) {
[0]=>
string(9) "<a href=""
[1]=>
string(28) "<a class="fancyStyle" href=""
}
[1]=>
array(2) {
[0]=>
string(9) "<a href=""
[1]=>
string(28) "<a class="fancyStyle" href=""
}
}
工作代码
您的代码存在一些问题,但是,阻止您获得预期的URL 的原因是您只是在在到达它之前停止捕获。
以下正则表达式将匹配a 标记的href 属性内的URLs。
#<a\s.*?(?:href=['"](.*?)['"]).*?>#is
说明
-
<a - 匹配 a 标签的开头
-
\s.*? - 匹配空格字符后跟任何字符0次或更多次
-
(?: - 创建一个非捕获组
-
href= - 匹配 href=
-
['"] - 匹配 ' 或 "
-
(.*?) - 创建一个捕获组并匹配 0 个或更多 个字符之前...
-
['"] - 匹配 ' 或 "
-
) - 结束非捕获组
-
.*?> - 匹配任意字符0 次或更多 次,后跟>
-
i - 使正则表达式不区分大小写
-
s - 使 . 匹配所有字符(包括换行符)
工作示例
preg_match_all('#<a\s.*?(?:href=[\'"](.*?)[\'"]).*?>#is', $string, $matches);
var_dump($matches);
/**
array(2) {
[0]=>
array(2) {
[0]=>
string(34) "<a href="http://www.google.co.uk">"
[1]=>
string(65) "<a class="fancyStyle" href="http://www.youtube.com" id="link136">"
}
[1]=>
array(2) {
[0]=>
string(23) "http://www.google.co.uk"
[1]=>
string(22) "http://www.youtube.com"
}
}
*/
示例输入
所有代码都使用以下内容作为preg_match 函数的输入...
$string = <<<EOC
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title of page</title>
</head>
<body>
<h1>Main Page title</h1>
<p>
The following is a <a href="http://www.google.co.uk">link to google</a>.
This is <a class="fancyStyle" href="http://www.youtube.com" id="link136">another link</a>
</p>
</body>
</html>
EOC;