2013-03-05 53 views
2

我有這個函數解析一些內容來檢索自制鏈接標記並將其轉換爲普通鏈接標記。正則表達式 - 如何一次匹配一個模式

可能的輸入:

<p>blabalblahhh <moolinkx pageid="121">text to click</moolinkx> blablabah</p> 

輸出:

<p>blabalblahhh <a href="whateverpage.htm">text to click</a> blablabah</p> 

這裏是我的代碼:

$regex = '/\<moolinkx pageid="(.{1,})"\>(.{1,})\<\/moolinkx\>/'; 
preg_match_all($regex, $string, $matches); 

它的工作原理非常清楚如果只有一個的字符串中。但只要有第二個,它就不起作用。

輸入:

<p>blabalblahhh <moolinkx pageid="121">text to click</moolinkx> blablabah.</p> 
<p>Another <moolinkx pageid="128">text to clickclick</moolinkx> again blablablah.</p> 

,當我的print_r($比賽)這就是我的了:

Array 
(
[0] => Array 
    (
     [0] => <moolinkx pageid="121">text to click</moolinkx> blablabah.</p><p>Another <moolinkx pageid="128">text to clickclick</moolinkx> 
    ) 

[1] => Array 
    (
     [0] => 121">text to click</moolinkx> blablabah.</p><p>Another <moolinkx pageid="128 
    ) 

[2] => Array 
    (
     [0] => text to clickclick 
    ) 

) 

我不放心用正則表達式,所以它必須有一些很瑣碎.. ,但我無法找出它是什麼:(

非常感謝你提前

注意:這是我的在這裏第一篇文章,雖然我已經使用這個了不起的Q & A多年!

+1

讓您的正則非貪婪。 – 2013-03-05 10:27:47

回答

1

使用正則表達式負:
$regex = '/<moolinkx pageid="([^"]+)">([^<]+)<\/moolinkx>/';

解釋演示在這裏:http://regex101.com/r/sI3wK5

+0

太棒了!這很快......它運作得非常好。謝謝youuuu – Siouw 2013-03-05 11:27:02

+0

失敗,如果有鏈接中的任何標籤,例如:'一些文本重點鏈接' – 2013-03-05 12:51:14

+0

當然它失敗@GarethCornish ...正則表達式不適用於解析HTML ,這是一個特定的情況 – 2013-03-05 12:56:03

1

您正在使用貪婪選擇器,它將第一個打開標記和最後一個結束標記之間的所有內容都識別爲標記之間的內容。您正則表達式更改爲:

$regex = '/\<moolinkx pageid="(.+?)"\>(.+?)\<\/moolinkx\>/'; 
preg_match_all($regex, $string, $matches); 

注意的.{1,}已更改爲.+?+表示一個或多個實例,並且?通知正則表達式選擇它可以滿足表達式的最少字符。