سؤال

لدي مشكلة مع regex. أريد ترجمة رابط BBCode مثل

link = www.stackoverflow.com] stack-overflow [/link

في رابط HTML مثل

<a href='www.stackoverflow.com'>Stack-Overflow</a>.

في سلسلتي ، من الممكن أن تصنع أكثر من رابط واحد في BBCode. أحتاج أيضًا إلى وظيفة لترجمة HTML مرة أخرى إلى BBCode.

وظائفي هي BBCode إلى HTML:

$Text = preg_replace('/\[link=([^ ]+).*\](.*)\[\/link\]/', '<a href="$1">$2</a>', $Text);  

HTML إلى BBCode:

$Text = preg_replace('/\<a href="([^ ]+).*\">(.*)\<\/a\>/Usi', '[link=$1]$2[/link]', $Text); 

مشكلتي هي مع وظائف Thees ، عندما يكون لدي أكثر من رابط واحد ، فإنه لا يعمل ، وعندما يكون لدي رابط واحد مترجم إلى HTML وأريد ترجمة مرة أخرى ، ليس لدي سوى الشخصية الأولى للرابط.

هل يمكن للجميع مساعدتي؟ شكرا لك مقدما

هل كانت مفيدة؟

المحلول

أما بالنسبة لمشكلتك الأولى ، * جشع ، لذلك يمسك بكل شيء بين الروابط الأولى والأخيرة. الحل البسيط هو استخدام مؤهل غير غريدي ، أو عدم السماح [] في مجموعاتك:

\[link=([^ \[\]]+)\]([^\[\]]*)\[\/link\]

وبالمثل ، في العكس:

<a href="([^ "]+)">([^<]*?)\<\/a\>

ها هي النسخة غير الخضراء. تسمح [] في الروابط ، وحتى أقصر:

\[link=([^ ]*?)\](.*?)\[\/link\]

نصائح أخرى

مشكلتك مع الجشع.* استخدم؟ لجعلها غير جشع.

$Text = preg_replace(
    '/\[link=([^ ]+).*?\](.*?)\[\/link\]/',
    '<a href="$1">$2</a>',
    $Text
);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top