Php 如何在两个标记之间捕获文本?正则表达式
我想捕获Php 如何在两个标记之间捕获文本?正则表达式,php,regex,Php,Regex,我想捕获 HTML 我的正则表达式 preg_match_all("/<div\s*class="tags">\s*<a\shref=".*"\s*>(.*)</a>/i", $html, $arr); preg\u match\u all(“/\s*/i”,$html,$arr); 它不能正常工作,因为它只捕获第一个数据“hourse”,而不是下面的“pik、turtle等”。还有别的办法吗 p、 d:我知道使用正则表达式捕获html标记不是一个好主
HTML
我的正则表达式
preg_match_all("/<div\s*class="tags">\s*<a\shref=".*"\s*>(.*)</a>/i", $html, $arr);
preg\u match\u all(“/\s*/i”,$html,$arr);
它不能正常工作,因为它只捕获第一个数据“hourse”,而不是下面的“pik、turtle等”。还有别的办法吗
p、 d:我知道使用正则表达式捕获html标记不是一个好主意,但我想知道这个示例是否有解决方案。试试这个
$str = '<div class="tags">
<a href="tag/hourse" class="cloud-2">hourse</a>
<a href="tag/pik" class="cloud-4">pik</a>
<a href="tag/turtle" class="cloud-2">turtle</a>
<a href="tag/pillot" class="cloud-2">pillot</a>
<a href="tag/glass" class="cloud-1">glass</a>
<a href="tag/dog" class="cloud-2">dog</a>
<a href="tag/cat" class="cloud-2">cat</a>
<a href="tag/fish" class="cloud-1">fish</a></div>';
preg_match_all('/\<a href=".*"\>(.*)\<\/a\>/', $str, $matches);
$str='1〕
';
preg_match_all('/\(.*)\/',$str,$matches);
$matches[1]
将包含您搜索的字符串正则表达式不应用于此类任务,但在简单的代码中,您可以很好地使用正则表达式模式
(?<=>)[^<>]*?[^\s<>][^<>]*?(?=<)
(?)[^]*?[^\s][^]*?(?=每行和非所有内容的默认正则表达式检查,然后您可以使用此正则表达式捕获hourse、pik、turtle或其他:
preg_match_all("/tag\/([\w_]+)/", "content of inputs", $matches);
return
Array
(
[0] => Array
(
[0] => tag/hourse
[1] => tag/pik
[2] => tag/turtle
[3] => tag/pillot
[4] => tag/glass
[5] => tag/dog
[6] => tag/cat
[7] => tag/fish
)
[1] => Array
(
[0] => hourse
[1] => pik
[2] => turtle
[3] => pillot
[4] => glass
[5] => dog
[6] => cat
[7] => fish
)
)
您可以使用DOMDocument,如:
$dom = new DOMDocument; @$dom->loadHTMLFile('yourFile.php');
// for XML use @$dom->load('yourfile.rss') file extension may differ
function getElementsByClassName($domDoc, $className){
$all = $domDoc->getElementsByTagName('*');
foreach($all as $e) {
if(!$e->hasAttribute('class')){
continue;
}
if(!in_array($className, preg_split('/\s+/', $all->getAttribute('class')))){
continue;
}
$r[] = $e;
}
return $r;
}
$tags = getElementsByClassName($dom, 'tags'); $result = '<dl>';
foreach($tags[0]->childNodes as $c){
if($c->nodeType === 1){
$result .= "<dt>{$c->textContent}</dt><dd>{$c->getAttribute('href')}</dd>";
}
}
$result .= '</dl>';
echo $result;
$dom=newdomdocument;@$dom->loadHTMLFile('yourFile.php');
//对于XML,使用@$dom->load('yourfile.rss')文件扩展名可能不同
函数getElementsByClassName($domDoc,$className){
$all=$domDoc->getElementsByTagName('*');
foreach(全部为$e){
如果(!$e->hasAttribute('class')){
继续;
}
如果(!在数组($className,preg_split('/\s+/',$all->getAttribute('class'))中){
继续;
}
$r[]=$e;
}
返回$r;
}
$tags=getElementsByClassName($dom,'tags');$result='';
foreach($tags[0]->childNodes作为$c){
如果($c->nodeType==1){
$result.=“{$c->textContent}{$c->getAttribute('href')}”;
}
}
$result.='';
回声$结果;
@johncode我知道使用DOM更容易,但我想知道它是否有使用正则表达式的解决方案。您的HTML不包含您要查找的字符串。没有class=“exa-1”
任何地方。此外,HTML解析不是正则表达式的工作。使用a。您是否使用preg\u match
或preg\u match\u all
?您的regexp中是否有m
多行平面?这很有效,但不是完整的代码,在这个HTML文件中有其他URL,这就是为什么我要输入您想要的内容捕获?我只想捕获其中的文本
preg_match_all("/tag\/([\w_]+)/", "content of inputs", $matches);
return
Array
(
[0] => Array
(
[0] => tag/hourse
[1] => tag/pik
[2] => tag/turtle
[3] => tag/pillot
[4] => tag/glass
[5] => tag/dog
[6] => tag/cat
[7] => tag/fish
)
[1] => Array
(
[0] => hourse
[1] => pik
[2] => turtle
[3] => pillot
[4] => glass
[5] => dog
[6] => cat
[7] => fish
)
)
$dom = new DOMDocument; @$dom->loadHTMLFile('yourFile.php');
// for XML use @$dom->load('yourfile.rss') file extension may differ
function getElementsByClassName($domDoc, $className){
$all = $domDoc->getElementsByTagName('*');
foreach($all as $e) {
if(!$e->hasAttribute('class')){
continue;
}
if(!in_array($className, preg_split('/\s+/', $all->getAttribute('class')))){
continue;
}
$r[] = $e;
}
return $r;
}
$tags = getElementsByClassName($dom, 'tags'); $result = '<dl>';
foreach($tags[0]->childNodes as $c){
if($c->nodeType === 1){
$result .= "<dt>{$c->textContent}</dt><dd>{$c->getAttribute('href')}</dd>";
}
}
$result .= '</dl>';
echo $result;