簡體   English   中英

正則表達式單行多個匹配

[英]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>'; 

任何幫助表示贊賞。

a和b的示例http://www.phpliveregex.com/p/4fU

遍歷可以在給定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內容附件使用否定字符集,而不是簡單地使用.+.*因為默認情況下它們是貪婪的。 這可以通過使用.+?來更改.+? .*? 否定字符集將減少回溯。

另外,您只需要對錨的兩個部分(而不是全部五個)執行內存捕獲。

並非針對您的問題,但您可以在最后一個斜杠后將修飾符添加到正則表達式模式中:

preg_replace('/ whatever_my_pattern_do / MODIFIERS',“這里我替換”,$ text);

你應該在這里檢查一下

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM