سؤال

مرحبًا، ما أريد فعله هو قطع محتوى الفقرة الأولى.السلسلة $blog_post يحتوي على الكثير من الفقرات بالتنسيق التالي:

<p>Paragraph 1</p><p>Paragraph 2</p><p>Paragraph 3</p>

المشكلة التي أواجهها هي أنني أكتب تعبيرًا عاديًا للاستيلاء على كل شيء بين الأول <p> العلامة والإغلاق الأول </p> بطاقة شعار.ومع ذلك، فإنه الاستيلاء على الأول <p> العلامة و آخر إغلاق </p> العلامة التي تؤدي إلى الاستيلاء على كل شيء.

هنا هو قانون بلدي الحالي:

if (preg_match("/[\\s]*<p>[\\s]*(?<firstparagraph>[\\s\\S]+)[\\s]*<\\/p>[\\s\\S]*/",$blog_post,$blog_paragraph))
   echo "<p>" . $blog_paragraph["firstparagraph"] . "</p>";
else
  echo $blog_post;
هل كانت مفيدة؟

المحلول

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

<p>.*?</p>

وضع ? بعد الخاص بك * يجعلها غير جشعة، مما يعني أنها لن تتطابق إلا مع القليل من النص حسب الضرورة قبل مطابقة </p>.

نصائح أخرى

إذا كنت تستخدم preg_match, ، استخدم ال "أنت" العلم لجعله غير الجشع.

preg_match("/<p>(.*)<\/p>/U", $blog_post, &$matches);

$matches[1] سوف تحتوي بعد ذلك على الفقرة الأولى.

ربما سيكون أسهل وأسرع في الاستخدام ستبوس () للعثور على موقف الأول

 <p>

وأول

</p>

ثم استخدام فرعية () لاستخراج الفقرة.

 $paragraph_start = strpos($blog_post, '<p>');
 $paragraph_end = strpos($blog_post, '</p>', $paragraph_start);
 $paragraph = substr($blog_post, $paragraph_start + strlen('<p>'), $paragraph_end - $paragraph_start - strlen('<p>'));

يحرر: في الواقع، سيكون التعبير العادي في إجابات الآخرين أسهل وأسرع ...إن عباراتك المعقدة الكبيرة في السؤال أربكتني ...

إن استخدام التعبيرات العادية لتحليل HTML ليس هو الحل الصحيح أبدًا.يجب أن تستخدم XPATH لهذه الحالة بالذات:

$string = <<<XML
<a>
 <b>
  <c>texto</c>
  <c>cosas</c>
 </b>
 <d>
  <c>código</c>
 </d>
</a>
XML;

$xml = new SimpleXMLElement($string);

/* Busca <a><b><c> */
$resultado = $xml->xpath('//p[1]');
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top