[英]Regex single-line multiple match
使用PHP中的preg_replace
,我試圖在一個字符串中多次匹配一個正則表達式模式,有時在1行上有2個匹配項,有時則不行。
我有以下字符串:
$text = 'Check <a href="link1">text1</a> or <a href="link2">text2</a>
oh
well <a href="link3">text3</a>';
我希望將其轉換為:
Check
text1
link1
or
text2
link2
oh
well
text3
link3
我有這個:
$text = preg_replace('/(<a href=")(.+)(">)(.*)(<\/a>)/', "\n$4\n$2\n", $text);
但這僅在一行中有1個匹配項時才起作用。 喜歡:
$text = 'Check <a href="link1">text1</a>
or <a href="link2">text2</a>
oh
well <a href="link3">text3</a>';
任何幫助表示贊賞。
遍歷可以在給定HTML中找到的所有文本節點,並為父錨創建特殊情況:
$text = 'Check <a href="link1">text1</a> or <a href="link2">text2</a>
oh
well <a href="link3">text3</a>';
$dom = new DOMDocument;
$dom->loadHTML($text);
$xpath = new DOMXPath($dom);
foreach ($xpath->query('//text()') as $node) {
if ($node->nodeType == XML_TEXT_NODE) {
echo $node->textContent, "\n";
if ($node->parentNode->nodeType == XML_ELEMENT_NODE && $node->parentNode->nodeName == 'a') {
echo $node->parentNode->getAttribute('href'), "\n";
}
}
}
在文本域中,您可以這樣做:
echo preg_replace('~<a href="([^"]+)">([^<]+)</a>~i', "\n\$2\n\$1", $text);
基本上,您對href和tag內容附件使用否定字符集,而不是簡單地使用.+
和.*
因為默認情況下它們是貪婪的。 這可以通過使用.+?
來更改.+?
和.*?
否定字符集將減少回溯。
另外,您只需要對錨的兩個部分(而不是全部五個)執行內存捕獲。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.