سؤال

أحتاج إلى الحصول على إلكتروني عبر البريد الإلكتروني من مرساة مع سمة Mailto مع Regex.

هذا النمط: (.*)<a\s(.*?)(.*)\s*href\=['"]mailto:([-a-z0-9_]+)@([a-z0-9-]+).([a-z]+)['"]>(.*)</a>(.*)

يعمل في مدرب Regex على الرغم من أنه لا يعمل مع PHP.

شفرة:

preg_match("'(.*)<a (.*?)(.*) *href\=['\"]mailto:([-a-z0-9_]+)@([a-z0-9-]+).([a-z]+)['\"]>(.*)</a>(.*)'si", "<a href=\"mailto:someemail@ohio.com\"">Some email</a>", $matches);

print_r($matches);

فلماذا تعمل في PHP؟

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

المحلول

PHP's PCRE تتطلب لفها التعبير العادي المحددات هذا يفصل النمط عن الاختياري الصفات التعريفية. في هذه الحالة ، يتم استخدام أول شخصية غير رقمية (أي ') لذلك النمط هو في الواقع فقط (.*)<a (.*?)(.*) *href\=[ والباقي يعاملون كمعدلات. وهذا تعبير منتظم غير صالح مثل [ لا يهرب بشكل صحيح والباقي ليسوا معدلات صالحة لا.

كما اقترح الآخرون بالفعل ، يمكنك إصلاح ذلك عن طريق الهروب من أي حدوث محدد ' داخل التعبير العادي أو اختر محددًا مختلفًا لا يظهر في التعبير العادي.

ولكن إلى جانب ذلك ، فإن محاولة تحليل HTML مع التعبيرات العادية أمر عرضة للخطأ للغاية. في حالة استخدام هذا كثير .* سيؤدي أيضًا إلى سلوك أداء مروع (يرجع ذلك فقط إلى كيفية معالجة التعبيرات العادية).

من الأفضل استخدام محلل HTML المناسب الذي يعيد DOM يمكن الاستعلام عنه مثل مكتبة DOM في PHP:

$doc = new DomDocument();
$doc->loadHTML($str);
foreach ($doc->getElementsByTagName("a") as $a) {
    if ($a->hasAttribute("href")) {
        $href = trim($a->getAttribute("href"));
        if (strtolower(substr($href, 0, 7)) === 'mailto:') {
            $components = parse_url($href);
        }
    }
}

نصائح أخرى

محددك هو اقتباس ', وهناك بعض الحالات في regex:

preg_match("'(.*)<a (.*?)(.*) *href\=['\"]mailto:([-a-z0-9_]+)@([a-z0-9-]+).([a-z]+)['\"]>(.*)</a>(.*)'si", "<a href=\"mailto:someemail@ohio.com\"">Some email</a>", $matches);
                                      ^                                              ^

الهروب منهم (أي: \') أو تغيير محدد الخاص بك.

if (preg_match('#<a\s.*?href=[\'"]mailto:([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6})[\'"].*?>.*?</a>#i', $subject, $regs)) {
    $result = $regs[0];
} else {
    $result = "";
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top