سؤال

$url = "example-com--folder";
$searchArray = array('/-/','/--/');
$replaceArray = array('.','/');
$url = preg_replace($searchArray, $replaceArray, $url);

الإخراج الذي أريده هو example.com/folder ولكن كل ما أحصل عليه الآن هو example.com..folder

أعلم أن السبب في ذلك هو أنني لا أملك نمط التعبير العادي المناسب، ولكن ماذا سيكون هذا النمط؟

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

المحلول

تغيير ترتيب '/--/' و '/-/' الأنماط بحيث '/--/' يتم التحقق أولا، وإلا '/-/' سوف تتفوق '/--/'.لا تقم باستيفاء المصفوفات في المكالمة إلى preg_replace.

$url = "example-com--folder";
$searchArray = array('/--/', '/-/');
$replaceArray = array('/', '.');
$url = preg_replace($searchArray, $replaceArray, $url);

البدائل:

  • استخدام مكالمات متعددة ل preg_replace بالترتيب الذي ترغب في تقييم REs.هذا ليس مرفوضًا كما قد تعتقد لأنه preg_replace حلقات فوق المصفوفات وتتعامل مع كل RE بدورها.
  • استخدم بديلاً تم تقييمه

    $url = "www-example-com--folder";
    $replacements = array('-' => '.', '--' => '/');
    $url = preg_replace('/(--?)/e', '$replacements["$1"]', $url);
    
  • إستخدم انظر إلى الأمام وانظر إلى الخلف

    $url = "www-example-com--folder";
    $searchArray = array('/(?<!-)-(?!-)/', '/--/');
    $replaceArray = array('.', '/');
    $url = preg_replace($searchArray, $replaceArray, $url);
    

نصائح أخرى

وهذا هو PHP، الحق؟

وتحتاج إلى محدد الكمية لتحديد أنك تريد بالضبط اثنين الواصلات في النمط الثاني. جرب:

$searchArray = array('/-/','/-{2}/');

ووالأقواس المعقوفة تقول: يتطلب بالضبط <م> ن من النمط السابق '

وإليك جيدة إشارة .

ونرى ما اذا كان يعمل هذا:

$url = "example-com--folder";
$searchArray = array('([^-])-([^-])','--');
$replaceArray = array('$1.$2','/');
$url = preg_replace("$searchArray", "$replaceArray", $url);

وما يقول هذا هو "تطابق اي - ان لا يكون شرطة قبل أو بعد والاستعاضة عن ذلك مع". و"مباراة مزدوجة - مع /". من الواضح، يمكنك توسيع هذا للحد من المباراة الثانية إلى 2 شرطات فقط بإضافة ([^ -]) في من والظهر. كما هو، "-----" ستصبح "//"، التي قد لا ترغب.

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