PHP düzenli ifade bulmak ve dize eklenecek

3 Cevap php

Ben aşağıdakileri yapmak için düzenli ifadeler (preg_match ve preg_replace) kullanmaya çalışıyorum:

Böyle bir dize bul:

{%title=append me to the title%}

Ardından title bölümünü ve append me to the title kısmını ayıklayın. Ben o zaman), vb (bir str_replace gerçekleştirmek için kullanabileceğiniz

Ben düzenli ifadelere korkunç olduğumu göz önüne alındığında, benim kod başarısız olduğunu ...

 preg_match('/\{\%title\=(\w+.)\%\}/', $string, $matches);

Ne desen ihtiyacım var? :/

3 Cevap

Ben \w operatörü boşluk uymuyor çünkü düşünüyorum. Eşittir işaretinden sonra her şey sizin kapanış önce sığdırmak için gerekli olduğundan %, tüm bu parantez içinde ne olursa olsun maç var (ya da başka tüm ifade eşleştirememişse).

Bu kod benim için biraz çalıştı:

$str = '{%title=append me to the title%}';
preg_match('/{%title=([\w ]+)%}/', $str, $matches);
print_r($matches);

//gives:
//Array ([0] => {%title=append me to the title%} [1] => append me to the title ) 

Kullanımı + (bir ya da daha fazla) bu boş bir ifade, yani anlamına unutmayın. {%title=%} maç olmayacak. Eğer boşluk için beklediğiniz bağlı olarak, \w karakter sınıfı yerine gerçek bir boşluk karakteri sonra \s kullanmak isteyebilirsiniz. \s vb sekmeler, satırsonu, maç olacak

Sen deneyebilirsiniz:

$str = '{%title=append me to the title%}';

// capture the thing between % and = as title
// and between = and % as the other part.
if(preg_match('#{%(\w+)\s*=\s*(.*?)%}#',$str,$matches)) {
    $title = $matches[1]; // extract the title.
    $append = $matches[2]; // extract the appending part.
}

// find these.
$find = array("/$append/","/$title/");

// replace the found things with these.
$replace = array('IS GOOD','TITLE');

// use preg_replace for replacement.
$str = preg_replace($find,$replace,$str);
var_dump($str);

Çıktı:

string(17) "{%TITLE=IS GOOD%}"

Not:

Lütfen regexdeki: /\{\%title\=(\w+.)\%\}/

  • There is no need to escape % as its not a meta char.
  • There is no need to escape { and }. These are meta char but only when used as a quantifier in the form of {min,max} or {,max} or {min,} or {num}. So in your case they are treated literally.

Bu deneyin:

preg_match('/(title)\=(.*?)([%}])/s', $string, $matches);

Maç [1] yout gelmiştir başlık ve maç [2] diğer parçası vardır.