التعبير العادي يطابق أنماطًا متعددة
-
05-07-2019 - |
سؤال
$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 شرطات فقط بإضافة ([^ -]) في من والظهر. كما هو، "-----" ستصبح "//"، التي قد لا ترغب.