Regex Temelleri: iki sabiti arasındaki kapmak metin

6 Cevap php

PHP (oldukça basit) regex sorun takılıp.

Metin bir karmaşa içinde gömülü bu bölüm:

  <tr>
        <td id="descriptionArea">
            Customer request to remove "Intro - 01/13/09" video clip.
            <br/>
        </td>
    </tr>

Ben arasında ne olursa olsun istiyoruz:

descriptionArea">

... Ve ...

</td>

Bir arkadaşım önerdi:

$pattern = '<td="descriptionArea">\s*(.*?)\s*<';
$clean = preg_replace("'[\n\r\s\t]'","",$text); // to rid of line breaks
preg_match($pattern, $clean, $matches);
print_r($matches);

Ama ben aşağıdaki hatayı alıyorum:

Warning: preg_match() [function.preg-match]: Unknown modifier 'q'

Ben ikinci soru preg_match de, bunun için doğru PHP işlevi olup olmadığını varsayalım. Ben bunun yerine Ereg kullanıyor olmalıdır? Yardımlarınız için teşekkürler.

6 Cevap

preg_* işlevleri kullanırken, ilk karakter veya desen sınırlayıcı olarak kabul edilir:

The expression must be enclosed in the delimiters, a forward slash (/), for example. Any character can be used for delimiter as long as it's not alphanumeric or backslash (\). If the delimiter character has to be used in the expression itself, it needs to be escaped by backslash. Since PHP 4.0.4, you can also use Perl-style (), {}, [], and <> matching delimiters.
Regular Expressions (Perl-Compatible) – Introduction

Yani başkalarının dediği gibi & karakterleri kaçmak ya da değiştirmek gerekmez. Bunun yerine uygun sınırlayıcı kullanıyorsanız ve ifadenin içinde karakterleri kaçış:

'/&lt;td id=&quot;descriptionArea&quot;&gt;(.*?)&lt;\/td&gt;/'

Sen wombleton dediği gibi, "ve" dışarı kaçmak istiyor, ve aynı zamanda ileri ile desen $ desen gibi = "/ model /", bölü içine edeceğiz;

Aşağıdaki kodu, bazı çirkin şeyler ile bir dizi döndürür ama en azından bir maç döndürür .. :)

$description = " &lt;tr&gt;
        &lt;td id=&quot;descriptionArea&quot;&gt;
            Customer request to remove &quot;Intro - 01/13/09&quot; video clip.
            &lt;br/&gt;
        &lt;/td&gt;
    &lt;/tr&gt;";

$pattern = "/&lt;td.*[&]quot;descriptionArea[&]quot;[&]gt;\s*(.*?)\s*.*?lt/";
$clean = preg_replace("'[\n\r\s\t]'","",$description); // to rid of line breaks

preg_match($pattern, $clean, $matches);
var_dump($matches);

EDIT

Burada güzel bir versiyonu. Eğer standart bir HTML ayrıştırma regex kullanabilirsiniz böylece tüm HTML kodlaması kurtulun:

$pattern = '/<.*?id="descriptionArea">(.*?)<\/td>/';
$clean = preg_replace("'[\n\r\t]'","",htmlspecialchars_decode($description)); 
preg_match($pattern, $clean, $matches);

Ben bazı tür denetim karakterleri olarak ve işaretleri yorumlamak oluyor sanıyorum. Ancak bu destek için bir başvuru bulamıyor.

& ile örneklerini tüm değiştirmeyi deneyin [&].

Iki constants arasındaki metni kapmak istiyorsanız, iyi ol 'strpos kullanmak daha kolay olmaz mıydı?

EDIT

örneğin

$string = 'text to be >searched< within';
$const1 = '>';
$const2 = '<';
$start = strpos($string, $const1);
$end = strpos($string, $const2, $start + strlen($const1));
$result = substr($string, $start, $end - $start);

Bunu çalıştırmak değil, bu yüzden adamcağız olabilir, ama fikir almalısınız.

Ne $ desen için aşağıdaki kullanılır?

$pattern = '(?s:descriptionArea&quot;&gt;(.*)&lt;/td&gt;)';

Ben PHP bilmiyorum, ama RegEx bunu test edildiğinde Düzenli İfade Tasarımcısı içinde çalışması için görünür. (? S :) seçeneği 'SingleLine On' olduğunu.

Markos

Eğer alıyorsanız belirli bir hata (bu durumda "&") sınırlayıcı olarak desen ilk karakteri kullanarak preg_ * işlevleri geliyor, ve bu "i" durum gibi düzenleyiciler (as sınırlayıcı ikinci gelmesinden sonra her şey -duyarsızlık.)

Bu durumda, bu lt;td= arıyoruz düşünüyor ve nitelemeler quot;descriptionArea&quot;&gt;\s*(.*?)\s*&lt; istiyorum. İlk değiştirici "q" mantıklı değil, ve bir teminat.