PHP، preg_match، تعبير منتظم. ما الخطأ الذي افعله؟

StackOverflow https://stackoverflow.com/questions/1726455

  •  19-09-2019
  •  | 
  •  

سؤال

هنا هو النمط الذي أريد مطابقته:

<div class="class">
<a href="http://www.example.com/something"> I want to be able to capture this text</a>
<span class="ptBrand">

هذا ما أقوم به:

$pattern='{<div class="productTitle">[\n]<((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)>([^\n]*)</a>[\n]<span class="ptBrand">}';

preg_match($pattern, $data, $matches,PREG_OFFSET_CAPTURE);

print_r($matches);

يطبع:

مجموعة مصفوفة ( )

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

المحلول

كقاعدة عامة، تعتبر التعبيرات العادية وسيلة سيئة للغاية لتحليل HTML. انهم غير موثوقين ويميلون إلى نهاية المطاف أن تكون معقدة حقا. الحل القوي أكثر بكثير هو استخدام محلل HTML. يرى تحليل HTML مع PHP و DOM.

أما بالنسبة للتعبير الخاص بك، لا أرى <div class="productTitle" في أي مكان في المصدر لذلك سأبدأ هناك. وبالمثل، تحاول تحليل عنوان URL ولكن لا يوجد ذكر علامة المرساة (إما مباشرة أو من خلال أحرف بدائية كافية) لذلك سوف تفشل هناك أيضا. أساسا أن التعبير لا يبدو مثل HTML الذي تحاول تحليله.

نصائح أخرى

... أو هذا:

preg_match('/\s*([^>]+)\s*<\/a/',$string,$match);

حوافها أيضا.

النمط:

/<div class="class">\s*<a href=\"([^"]+)\">([^<]+)</a>/m

سيحصل على الرابط والنص تقريبا، ولكن استخدام مكتبة DOM سيكون طريقة أفضل بكثير.

يمكنك تجربة هذا:

<a href=".*?">([\s\S]*?)</a>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top