我正在尝试使用preg_match来查找内部提到的网址和标记,以便我可以用更新的域名替换它们。现在我只是想在href标签中找到这个问题的搜索脚本,以便我可以打印找到的网址。这就是我所拥有的:
$matches = array();
$search="domain.com";
preg_match('|(<a\s*[^>]*href=[\'"]?)|',$prod['value'],$matches);
echo '<p>'.$matches[1].'</p>';
$prod['value']
指的是我试图筛选的内容
答案 0 :(得分:2)
$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
,这样你就可以获得一个列表输入中的所有URLs
。
第四,继三个之后,这意味着您需要var_dump
或print_r
而不是echo
,因为$matches[X]
的内容将是array
。
好的,现在你的正则表达式实际上做了什么...
(<a\s*[^>]*href=['"]?)
(
- 启动捕获组<a\s*
- 匹配<a
后跟 0或更多空白字符[^>]*
- 匹配 0或更多不是>
的字符href=
- 匹配href=
['"]?
- 可选择匹配'
或"
)
- 结束捕获组这一切意味着针对示例输入运行您的正则表达式将匹配来自第一个链接示例(谷歌)的<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
的问题是您只是在>>之前停止捕获。
以下正则表达式将与URL
标记的href
属性中的a
匹配。
#<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;