[英]How to capture text between two markers? regex php
我想在<a href="tag/hourse">hourse</a>
之間捕獲文本
HTML
<div class="tags">
<a href="tag/hourse">hourse</a>
<a href="tag/pik">pik</a>
<a href="tag/turtle">turtle</a>
<a href="tag/pillot">pillot</a>
<a href="tag/glass">glass</a>
<a href="tag/dog">dog</a>
<a href="tag/cat">cat</a>
<a href="tag/fish">fish</a>
</div>
我的正則表達式
preg_match_all("/<div\s*class="tags">\s*<a\shref=".*"\s*>(.*)</a>/i", $html, $arr);
它不能正常工作,因為它僅捕獲第一個數據“小時”,而不是隨后的“豬,烏龜等”。 還有另一種方法嗎?
pd:我知道使用正則表達式捕獲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);
$matches[1]
將包含您要查找的字符串
正則表達式不應該用於此類任務,但是在簡單的代碼中,使用正則表達式模式會很好
(?<=>)[^<>]*?[^\s<>][^<>]*?(?=<)
然后將是PHP代碼
preg_match_all('/(?<=>)[^<>]*?[^\s<>][^<>]*?(?=<)/', $str, $matches);
在此處查看演示。
每行而不是不是所有內容的正則表達式檢查的默認值,那么您可以使用此正則表達式來捕獲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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.