Belirli bir metin ile Regex PHP, Maç tüm bağlantıları

3 Cevap php

Bunun üzerine özel bir metin ile çapa maç olur PHP bir düzenli ifade için arıyorum. Örneğin ben gibi metin MyLink ile çapa almak istiyorum:

<a href="blabla" ... >mylink</a>

Yani her çapa uygun olmalıdır ancak belirli bir metni içeren sadece eğer öyleyse bu dizeleri uymalıdır:

<a href="blabla" ... >mylink</a>

<a href="blabla" ... >blabla mylink</a>

<a href="blabla" ... >mylink bla bla</a>

<a href="blabla" ... >bla bla mylink bla bla</a>

ama bu bir:

<a href="blabla" ... >bla bla bla bla</a>

Bu tek kelime MyLink içermiyor çünkü.

Ayrıca bu maç olmamalıdır: "mylink is string" bir çapa değildir çünkü.

Herkes herhangi bir fikir?

Thanx Granit

3 Cevap

Yerine ayrıştırıcı deneyin:

require_once "simple_html_dom.php";

$data = 'Hi, I am looking for a regular expression in PHP which would match the anchor with a 
specific text on it. E.g I would like to get anchors with text mylink like: 
<a href="blabla" ... >mylink</a>

So it should match all anchors but only if they contain specific text So it should match t
hese string:

<a href="blabla" ... >mylink</a>

<a href="blabla" ... >blabla mylink</a>

<a href="blabla" ... >mylink bla bla</a>

<a href="blabla" ... >bla bla mylink bla bla</a>

but not this one:

<a href="blabla" ... >bla bla bla bla</a> Because this one does not contain word mylink.

Also this one should not match: "mylink is string" because it is not an anchor.

Anybody any Idea? Thanx Granit';

$html = str_get_html($data);

foreach($html->find('a') as $element) {
  if(strpos($element->innertext, 'mylink') === false) {
    echo 'Ignored: ' . $element->innertext . "\n";
  } else {
    echo 'Matched: ' . $element->innertext . "\n";
  }
}

hangi çıktıyı üretir:

Matched: mylink
Matched: mylink
Matched: blabla mylink
Matched: mylink bla bla
Matched: bla bla mylink bla bla
Ignored: bla bla bla bla

simple_html_dom.php indirin: http://simplehtmldom.sourceforge.net/

Bu işe (regex dizesi oluşturmak ve yerine "MyLink" ihtiyacı ne olursa olsun dize eklemek) olmalıdır

<\s*a\s+[^>]*>[^<>]*mylink[^<>]*<\s*\/a\s*>

Ama bu tavsiye edilmez. Bunun yerine bir HTML ayrıştırıcı kullanmak ve etiketi işlemek gerekir. Regex gerçekten bunun için doğru bir araç değildir. (Eğer içeren bağlantıları varsa bu nadir olabilir ancak yukarıdaki regex ">" işe yaramaz)

Ben sadece etrafında uygun şal kullanırsanız php herhangi bir özel karakterlerini gerektirmez sanırım.

Regexpal.com test

A few notes::
\s* - To match optional whitespace
\s+ - To match atleast one space/tab and any extra optional whitespace
[^>] - Matches any character except '>'
[^<>]- Matches any character except '<' or '>'

GÜNCELLEME: "/" / m / regex php eşleşmesi için kaçtı

/<a[^>]*>([^<]*mylink[^<]*)<\/a>/

etiketler bağlantı içinde ise o (<a href="/xyz">xyz <i>mylink</i> aaa</a>) kıracak gibi, biraz basit, ama çalışması gerekir.