HTML Comment Etiketler içeriği bulmak ve değiştirmek için düzenli ifade

3 Cevap php

Ben kullanıcı ekleme flash video oynatıcılar, slayt ve diğer 'sert' kod kullanıcının kolayca yazabilirsiniz olamayacağını bildirmek için HTML yorumlarına dayalı bir sözdizimi kullanan bir CMS var.

The syntax for one FLV movies looks like this: <!--PLAYER=filename.flv-->

Ben bu kodu kullanabilirsiniz:

$find_players = preg_match("/<!--PLAYER\=(.*)-->/si", $html_content, $match);

Sadece bir oyuncu varsa, bu harika çalışıyor, $ maç [1] (bütün ihtiyacım olan) dosya ismini içerir

Regex bilgim yok olmaktadır, bu yüzden bir maç daha kapmak için bu ayarlamak mümkün değilim.

Sayfada daha varsa o ilk <!--PLAYER itibaren son (çok açgözlülükle maçları, çünkü bu tamamen kırar -->

3 Cevap

Muhtemelen (ungreedily maç, PCRE_UNGREEDY) regex değiştirici U istiyorum. Bu ilk başından itibaren maç olmayacak, yani mümkün olan en kısa maçı almak olacaktır

Kısaltılmış bir örnek:

<?php
$text = "blah\n<!-x=abc->blah<!-x=def->blah\n\nblah<!-x=ghi->\nblahblah" ;
$reg  = "/<!-x=(.*)->/U" ;
preg_match_all( $reg, $text, $matches ) ;
print_r( $matches ) ;

Sizin kod o zaman olur:

$find_players = preg_match_all("/<!--PLAYER=(.*)-->/Ui", $html_content, $matches);
// print $matches[1] ;

Kullanmakta olduğunuz 's' değiştirici (PCRE_DOTALL) muhtemelen yararlı değildir, ya da; bunu bir satır açmaya bir dosya adı olması olası konum.

EDIT: Stevens ben biraz daha net katılıyorum bu sözdizimi, anlaşılacağı @ - yakalama parantez için U değiştirici hareket.

$find_players = preg_match_all("/<!--PLAYER=(?U)(.*)-->/i", $html_content, $matches);

Düzenli ifadeler ile çalışırken, daha spesifik bir ifade yerine, genellikle aşırı geriye gidilmiştir neden olan "tembel nokta", kullanmak için genellikle daha ölçülebilir bulunuyor. Sen regex motoru overburdening olmadan aynı sonuçları elde etmek için olumsuz bir lookahead kullanabilirsiniz:

$find_players = preg_match("/<!--PLAYER=((?:[^-]+|-(?!->))*)-->/ig", $html_content, $match);

Bak, bu tembel nokta kullanarak bu gibi basit bir dava ile fark sorunlara neden olacağı muhtemel, ama her zaman ne demek exactly regex motoru söylemek için iyi bir alışkanlıktır. Bu durumda, bir açıklama sonlandırıcı geçmeden ("açgözlü") mümkün olduğunca çok karakter toplamak istiyorum. Bir terminatör başka tire ve bir büyüktür işaretini takip eden bir çizgi olduğunu. Yani, herhangi bir karakter except çizgi veya tire o herhangi bir sayı don't a comment sonlandırıcı başlamak sağlar.

$find_players = preg_match("/<!--PLAYER\=(.*?)-->/i", $html_content, $match);

(. *?)

sadece iyi çalışması gerekir.