سؤال

أنا بناء مدونة يجب أن تحليل علامات bbcode مثل هذا:

إدخال: <youtube=http://www.youtube.com/watch?v=VIDEO_ID&feature=channel>
انتاج:

<object width="400" height="245">
<param name="movie" value="http://www.youtube-    nocookie.com/v/VIDEO_ID&hl=en&fs=1&rel=0&showinfo=0"></param>
<param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param>
<embed src="http://www.youtube-nocookie.com/v/VIDEO_ID&hl=en&fs=1&rel=0&showinfo=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="400" height="245"></embed>
</object>

وظيفتي بسيطة بشكل لا يصدق حتى الآن، لأنني حصلت على عالقة في أسهل جزء! الآن، لدي وظيفة عملية ماجستير التي تسمي وظائف عملية الفرق. في هذه الحالة، أحدهم هو processyoutubevideos (). لذلك أنا أسميها مثل ذلك:

$str = eregi_replace('\<youtube=([^>]*)\>', processYouTubeVideos("\\1"), $str);

يتلقى ProcessYOutubeVideos () عناوين URL من داخل علامة YouTube تماما، ولكن لسبب ما، عند استخدام Explode (أو الانقسام) لم يتم العثور على محدد. حتى باستخدام قيم الاختبار مثل "U" أو "أنبوب" ...

function processYouTubeVideos ($str) {

    $params = explode("?", $str);
    $params = explode("&", $params[1]);

    return $params[0];

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

المحلول

يحاول:

$str = preg_replace('/<youtube=([^>]*)>/e', 'processYouTubeVideos("$1")', $str);

لن يعمل الكود الذي تحاول تشغيله، لأن الوظيفة الموجودة على سلسلة الإخراج سيتم استدعاء على النمط الهدف بدلا من الإخراج. هذا يعني أنك ترسل " 1" بيردارلي إلى الوظيفة. يضيف var_dump($str); إلى بداية الوظيفة وحاول تشغيل التعليمات البرمجية مرة أخرى، وسترى هذا بوضوح.

preg_replace. لديه علامة خاصة "E" التي يمكنك استخدامها لتنفيذ وظيفة في كل مرة يتم إجراء بديل. يعمل هذا عن طريق إدخال Subpattern في موضع العلامة (1 دولار) ثم تشغيل شيء مثل eval() أو create_function() على التعليمات البرمجية لتنفيذها واسترداد النتيجة. ثم أرسل ذلك مرة أخرى إلى preg_replace() والاستبدال الفعلي مصنوع.

نصائح أخرى

تتم تشغيل الدالة Processyoutubevideos (" 1") قبل eregi_replace.

ما يلي يفعل ما أعتقد أنك تنوي:

$str = eregi_replace('\<youtube=([^>]*)\>', "\\1", $str);
$str = processYouTubeVideos($str);

إنه يؤدي استبدال، ثم يرسل القيمة الناتجة إلى processyoutubevideos.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top