سؤال

أحاول إنشاء فصل دراسي لمحلل bbcode يمكنه إنشاء علامات مخصصة، ولكن لدي بعض المشاكل مع عناوين url

لقد فعلت كل ما أحتاجه دون مشاكل خاصة بفضل التعبيرات العادية ولكن لدي مشكلة عندما أحاول إنشاء علامة خاصة تشير إلى عنوان URL محدد.

لقد أضفت في صفي طريقة مثل هذا:

<?
    private function check_url_from_bbcode ($tag = "url", $css = null, $url_path = null) {
        $regex_url = " a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'";
        if (!isset ($css)) $css = $this->css_link;
        $regex_url = $this->regex_url;
        if (isset ($url_path)) $url_path = "$url_path/";
        $this->bbcode = preg_replace ("/\[$tag\]([$regex_url]*)\[\/$tag\]/", "<a title=\"Vai al link\" class=\"$css\" href=\"$url_path$1\">$1</a>", $this->bbcode);
        $this->bbcode = preg_replace ("(\[$tag\=([$regex_url]*)\](.+?)\[/$tag\])", "<a title=\"Vai al link\" class=\"$css\" href=\"$url_path$1\">$2</a>", $this->bbcode);
    }
?>

يعمل الكود بشكل جيد مع عناوين URL الكلاسيكية [url]http://ciao.com[/url] & [رابط =http://ciao.com]تشاو[/url]

ولكن لدي بعض المشاكل مع حالة صفحة موضوع عنوان url الخاص كنمط last.fm، لذا [فنان]Lemon Jelly[/artist].

يتم تحويل bblink إلى < a href="http://ciao.com/artist/Lemon Jelly">جيلي الليمون</a> (لقد استخدمت المسافات <a> فقط لإظهار رمز الرابط).
يحتوي الرابط على مسافات بيضاء في السمة href لذا لا يمكن أن يعمل أبدًا.

<?
    private function check_url_from_bbcode ($tag = "url", $css = null, $url_path = null) {
        $regex_url = " a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'";
        if (!isset ($css)) $css = $this->css_link;
        $regex_url = $this->regex_url;
        if (isset ($url_path)) $url_path = "$url_path/";
        // begin of the problem
        $this->bbcode = preg_replace ("/\[$tag\]([$regex_url]*)\[\/$tag\]/", "<a title=\"Vai al link\" class=\"$css\" href=\"$url_path".str_replace (" ", "+", $1)."\">$1</a>", $this->bbcode);
        // end of the problem
        $this->bbcode = preg_replace ("(\[$tag\=([$regex_url]*)\](.+?)\[/$tag\])", "<a title=\"Vai al link\" class=\"$css\" href=\"$url_path$1\">$2</a>", $this->bbcode);
    }
?>

لتجنب ذلك، كتبت جزءًا صغيرًا من التعليمات البرمجية التي تغير جزء href url بنفس عنوان url ولكن مع "+" بدلاً من المسافة البيضاء char، لذلك [فنان]جيلي ليمون[/artist] ينبغي أن يصبح < a href="http://ciao.com/artist/Lemon+Jelly">جيلي الليمون</a>

ليس لدي خبرة في PHP ولست متأكدًا من المشكلة، لقد استخدمت بناء الجملة هذا في مواقف أخرى دون مواجهة المشكلة.

هل يمكن لأحد أن يساعدني في معرفة أين أخطأت؟

نوع الخطأ هو PHP Parse error:خطأ في بناء الجملة، T_LNUMBER غير متوقع، توقع T_VARIABLE أو '$' في /...

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

المحلول

خطأ التحليل يرجع إلى حقيقة أن $1 ليس اسم متغير PHP صالح. يجب أن تبدأ بحرف أو تحت إيضاح. ال $1 متغير مأهول في preg_replace المعلمات صالحة فقط داخل المعلمات.

جرب شيئا أكثر مثل هذا:

$this->bbcode = preg_replace("/\[$tag\]([$regex_url]*)\[\/$tag\]/e", "'<a title=\"Vai al link\" class=\"$css\" href=\"$url_path'. str_replace(' ', '+', '$1'). '\">$1</a>'", $this->bbcode);

ال e يقوم المعدل بتقييم السلسلة البديلة كصفوف PHP، بحيث يجب أن تولد السلسلة التي تريدها.

ملاحظة، لا يمكنني اختباره الآن، لذلك قد تحتاج إلى قرصه قليلا. آسف :
تعديل لا تمانع في ذلك، حصلت على عقد عميل FTP. إصلاح Regex. إنها تعمل :)

نصائح أخرى

يرجى تقديم خطوط 2-3 قبل وبعد الخط الذي يحتوي على الخطأ (يجب أن يكون رقم السطر في خطأ PHP Parse.

هذا لا يبدو وكأنه مشكلة Regex ... أشبه مشكلة الهروب.

أنا جديد إلى حد ما، لماذا لم أستطع علقت للتو على السؤال أن أسأل هذا (كما كتبت ليست حقا إجابة)

لتجنب ذلك ، كتبت جزءًا صغيرًا من الكود يغير جزء URL HREF مع عنوان URL نفسه ولكن مع "+" بدلاً من ""

لماذا لا تستخدم urlencode على محتويات العلامة؟

لاحظ أنه يجب استخدام رمز urlencode لمعلمات الاستعلام فقط؛يجب استخدام مكونات الدليل الفعلي rawurlencode, لأن HTTP نفسه لا يستخدم + بدلاً من المسافات.

أعتقد أن المشكلة مع المرجع 1 دولار، والذي يستخدم في str_replace وظيفة خارج preg_replace الحجج. الحديث 1 دولار يعمل فقط داخل حدود preg_replace حجج، لذلك لا يمكنك تمريرها مثل متغير str_replace; ؛ يحاول استخدام $ 1 كمتغير، ولكن في PHP غير صالح لاسم متغير.

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