2013-03-05 2 views
2

У меня есть эта функция, которая анализирует некоторый контент для извлечения тега домашней ссылки и конвертирует его в обычный тег ссылки.Regex - Как совместить один шаблон за раз

Возможные вход:

<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 
    ) 

) 

Я не в своей тарелке с регулярным выражением, поэтому оно должно быть что-то очень тривиальный .. ., но я не могу точно определить, что это такое :(

большое спасибо заранее

NB: Это мой первый пост здесь, хотя я использовал этот потрясающий Q & A на века!

+1

Сделайте регулярное выражение не жадный. –

ответ

1

Используйте отрицательную Regex:
$regex = '/<moolinkx pageid="([^"]+)">([^<]+)<\/moolinkx>/';

Разъяснения демо здесь: http://regex101.com/r/sI3wK5

+0

Фантастический! это было быстро ... это прекрасно работает. Thank youuuu – Siouw

+0

Не удается найти теги в ссылке, например: ' Некоторые тексты с акцентом для ссылки' –

+0

, конечно, это не удается @GarethCornish ... regex не для разбора HTML , это конкретный случай –

1

Вы используете жадный селектор, который распознает все между первым тегом открытия и последним закрывающим тегом в качестве содержимого между тегами. Измените регулярное выражение:

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

Обратите внимание на .{1,} изменилось к .+?. + означает один или несколько экземпляров, а ? указывает регулярному выражению выбирать наименьшее количество символов, которые он может выполнить для выражения.