metin bir dize içinde bulunan bir alt dizeyi nasıl arama ve bunun tüm vurgulamak

2 Cevap php

Ben arama sonuçlarını vurgulamak için çalışıyorum ama parça etiketleri ile sınırlıdır çevreleyen metni dahil etmek istiyoruz.

$ Dönem "cool" Yani preg_replace ile bitmelidir:

<div><span style="background: #f00">My hair cut so cool!</span></div>

Ne yazık ki benim regex çevreleyen metni, sadece $ dönem yakalamak için görünmüyor. Çevredeki etiketleri geçerli etiketinin her türlü olabilir.

    0:  
    1:  $term = 'cool';
    2:  ob_start();
    3:

   10:  foreach($items as $item) {
   11:    // echoing results here
   12:    echo '<div>' . $item->text . '</div>';
   13:  }

   30:  $content = ob_get_contents();
   31:  ob_clean() ;
   32:
   33:  $pattern = "/(?<!<[^>])($term)/i";
   34:  $replace = "<span style=\"background: #f00\">$1</span>";
   35:  echo preg_replace($pattern, $replace, $content);
   36:

EDIT: foreach döngüsü birçok biridir ve ayrı bir sınıfta yer almaktadır. Bu nedenle ben döngü kendisi değiştirme yapamaz. Ayrıca bu veriler üzerinde nihai çıkış yerine, her bir döngü işlemek için daha etkili görünmektedir.

2 Cevap

Açısal parantez olmadığı öncesi dönem bir bütün karakterleri bulma gibi aynı ve ondan sonra önce ve sonra HTML etiketleri kadar bir dönem ve her şeyi bulmak. Bu regex ile Önemsiz:

$pattern = "/[^<>]*$term[^<>]*/i";
$replace = "<span style=\"background: #f00\">$0</span>";

Neden preg_replace ihtiyacı?

Bu i sorunu çözmüş nasıl olduğunu:

Case 1: Highlight a substring of the result: Use strpos() or stripos() to get the index of the first occurrence in a string. Next: Get the substring from index-X to index+L+Y, where X and Y is definded constants that describe number of characters to be highlighted before and after the word, and L is the length of the word. Then apply some -tag around the generated substring.

Olgu 2: Highlight the hole tag: Hala strpos / stripos göre arama yapabilirsiniz. Bölüm bir işaretçi sıfırdan substring olacak ve bölüm iki dize kalanı oluşur: Sonra iki parçaya bölmek dize. Sonra: dize 1 ve <'ilk occurense içinde'> 've (strrpos / strripos) son occurrense bul dizesinde 2. sizin vurgulama takın ve keyfini çıkarın ;)

Bazı insanlar, bir sorun ile karşılaştıklarında, "Ben normal ifadeler kullanmak olacak, biliyorum." Düşünmek Jamie Zawinski - Şimdi iki sorun var