سؤال

أحاول تحويل أي حدث لكلمة مع 3 chars أو أقل إلى نفس الكلمة مع سلسلة VVV المرفقة بها.
مثال: لـ -> forvvv
أنا أستخدم لا شيء لاتيني chars (UTF8) ، وبالتالي MB.
ما لدي هو:

$pattern='\b[.{1,6}]\b';
$text=mb_ereg_replace($pattern,'\0VVV',$text,'me');

ماذا ينقصني؟

فيما يلي دراسة حالة ، لا تصطاد شيئًا:

$text="א אב אבי אביהו מדינה שול של";
$pattern='/\b.{1,6}\b/um';
$text=preg_replace($pattern,'hhh',$text);
echo $text;
هل كانت مفيدة؟

المحلول

أنت لا تكتشف أو تجمع الأشياء بشكل صحيح.

يستخدم \w بالنسبة لأحواض الكلمات والأقواس القياسية بدلاً من الأقواس المربعة ، وأنت لا تقوم بتقييم رمز PHP في الاستبدال ، فأنت ببساطة تشير إلى مقاطع نصية تم التقاطها ، لذلك لا تحتاج إلى e علَم:

$pattern = '\b(\w{1,3})\b';
$text = mb_ereg_replace($pattern, '\0VVV', $text, 'm');

بدلا من ذلك ، الاستخدام preg_replace مع علم Unicode:

$text = preg_replace('/\b\w{1,3}\b/um', '\0VVV', $text)

إذا كنت بحاجة إلى تلبية احتياجات الأحرف العربية واليمين إلى اليسار ، فأنت بحاجة إلى خصائص أحرف unicode بدلاً من \w و \b (\w لا يتطابق مع رسائل من جميع اللغات ، و \b تطابق فقط بين \w\W و \W\w - هما كلاهما مكسور wrt. اللغات غير اللاتينية.)

جرب هذا intead:

$text = preg_replace('/(?

(ومرة أخرى ، لا يمكنني معرفة ما إذا كنت بحاجة إلى تشفير <أو لا)

$text = preg_replace('/(?<!\PL)(\pL{1,3})(?:\PL)/um', '\1VVV', $text);

نصائح أخرى

هذا يجب أن يتطابق ما تريد؟

\b(?<Match>\w{1,3})\b
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top