2010-09-08 3 views
0

У меня такое ощущение, что я могу пропустить что-то очень основное. В любом случае Heres сценарий:preg_replace в матчах другого preg_replace

Я использую preg_replace для преобразования ===inputA===inputB=== в <a href="inputB">inputA</a>
Это то, что я использую

$new = preg_replace('/===(.*?)===(.*?)===/', '<a href="$2">$1</a>', $old); 

Its работает нормально хорошо, но я также необходимо дополнительно ограничить InputB поэтому его как это

preg_replace('/[^\w]/', '', every Link or inputB); 

Так в основном, в первом коде, где вы видите $2 там мне нужно выполнять операции, которые $2, так что он содержит только \w, как вы можете видеть во втором коде. Таким образом, окончательный результат должен быть таким:
Преобразование ===The link===link's page=== в <a href="linkspage">The link</a>

Я понятия не имею, как сделать это, что я должен делать?

ответ

2

Хотя уже есть общепринятый ответ: это то, что /e модификатор или preg_replace_callback() предназначены для:

echo preg_replace(
    '/===(.*?)===(.*?)===/e', 
    '"<a href=\"".preg_replace("/[^\w]/","","$2")."\">$1</a>"', 
    '===inputA===in^^putB==='); 

//Output: <a href="inputB">inputA</a> 

Или:

function _my_url_func($vars){ 
    return '<a href="'.strtoupper($vars[1]).'">'.$vars[2].'</a>'; 
} 

echo preg_replace_callback(
    '/===(.*?)===(.*?)===/', 
    '_my_url_func', 
    '===inputA===inputB==='); 

//Output: <a href="INPUTA">inputB</a> 
+0

Wonderful, thats Именно то, что я искал! Благодаря! –

1

Попробуйте preg_match на первом, чтобы получить 2 совпадения в переменных, а затем используйте preg_replace() на той, которую вы хотите продолжить проверку?

1

Почему вы не извлекаете совпадения из первого регулярного выражения (preg_match) и не лечите результаты лечения, а затем помещаете их обратно в HTML-форму?

+1

Я думал об этом, а, тем не менее было бы хорошая идея показать некоторый код о том, как это сделать. – Christophe

+0

Сделал preg_match_all, затем использовал str_replace в цикле и, наконец, preg_replace. Но я разместил вопрос, потому что мне было интересно, есть ли способ выполнить операции непосредственно на «$ 2». Спасибо в любом случае :) –