Якорный текст регулярного выражения для ссылки - PullRequest
1 голос
/ 14 июля 2010

Я пытаюсь извлечь текст привязки из ссылки, отформатированной таким образом:

<h3><b>File</b> : <a href="/en/browse/file/variable_text">i_want_this</a></h3>

Мне нужен только текст привязки для ссылки: "i_want_this"

"variable_text"варьируется в зависимости от имени файла, поэтому я должен игнорировать это.

Я использую это регулярное выражение:

<a href=\"\/en\/browse\/file\/variable_text\">(.*?)<\/a>

Это, конечно, полная ссылка.

Ответы [ 7 ]

1 голос
/ 14 июля 2010

Я уверен, что у кого-то, вероятно, будет более элегантное решение, но я думаю, что это сделает то, что вы хотите.

Где:

$subject = "<h3><b>File</b> : <a href=\"/en/browse/file/variable_text\">i_want_this</a></h3>";

Вариант 1:

$pattern1 = '/(<a href=")(.*)(">)(.*)(<\/a>)/i';
preg_match($pattern1, $subject, $matches1);
print($matches1[4]);

Вариант 2:

$pattern2 = '(<a href=")(.*)(">)(.*)(</a>)';
ereg($pattern2, $subject, $matches2);
print($matches2[4]);
1 голос
/ 14 июля 2010

PHP использует довольно близкую версию к PCRE (PERL Regex).Если вы хотите узнать много нового о регулярных выражениях, посетите perlretut.org .Кроме того, посмотрите на генераторы Regex как exspresso.

Для вашего использования знайте, что регулярное выражение является жадным.Это означает, что когда вы указываете, что вы хотите что-то, после чего-то (любые повторения), а затем что-то, оно будет продолжаться, пока эта секунда не будет достигнута.:

  1. <a href="
  2. любой символ, любое количество раз (регулярное выражение =. *)
  3. ">
  4. любой символ,любое количество раз (regex =. *)
  5. </a>

после этого вы хотите захватить вторую группу «любой символ, любое количество раз».Вы можете сделать это, используя так называемые группы захвата (захватывайте что-либо внутри скобок как группу для последующего использования, также называемую обратные ссылки ).

Я бы также посмотрел на именованные подшаблоны , тоже - с ними вы можете ссылаться на ваш выбор с помощью удобочитаемой строки, а не индекса массива.Синтаксис для тех, кто в PHP: (?P<name>pattern), где name - это имя, которое вы хотите, а pattern - фактическое регулярное выражение.Я буду использовать это ниже.

Итак, все, что говорится, вот "ленивая паутина" для вашего регулярного выражения:

<?php
$str = '<h3><b>File</b> : <a href="/en/browse/file/variable_text">i_want_this</a></h3>';
$regex = '/(<a href\=".*">)(?P<target>.*)(<\/a>)/';
preg_match($regex, $str, $matches);

print $matches['target'];
?>

//This should output "i_want_this"

О, и одна заключительная мысль.В зависимости от того, что именно вы делаете, вы можете захотеть изучить SimpleXML вместо того, чтобы использовать для этого регулярное выражение.Вероятно, для этого потребуется, чтобы теги, которые мы видим, были просто фрагментами большого целого, поскольку SimpleXML требует правильно сформированного XML (или XHTML).

0 голосов
/ 14 июля 2010

Вы должны использовать инструмент Expresso для создания регулярных выражений ... Довольно удобно .. http://www.ultrapico.com/Expresso.htm

0 голосов
/ 14 июля 2010

Это должно работать:

<a href="[^"]*">([^<]*)

это говорит о том, что бери ВСЕ, что найдешь, пока не встретишь "

[^"]*

то же самое! Бери с собой все, пока не встретишь1008 *

Паратезы вокруг [^ <] *</p>

([^<]*)

сгруппируйте их! Так что вы сможете собирать эти данные в PHP! Если вы заглянете в руководство по PHP om preg_match, вы увидите там множество прекрасных примеров!

Удачи!

А для вашего конкретного примера:

<a href="/en/browse/file/variable_text">([^<]*)

Я использую

[^<]* 

, потому что в некоторых примерах ...

.*? 

может быть очень медленным! Не используйте это, если вы можете использовать

[^<]*
0 голосов
/ 14 июля 2010

Я не уверен на 100%, понимаю ли я то, что вы хотите. Это будет соответствовать контенту между тегами привязки. URL должен начинаться с / en / browse / file /, но может заканчиваться чем угодно.

#<a href="/en/browse/file/.+?">(.*?)</a>#

Я использовал # в качестве разделителя, так как он стал понятнее. Также будет полезно, если вы поместите их в одинарные кавычки, а не в двойные кавычки, чтобы вам вообще ничего не пришлось избегать.

Если вы хотите ограничить количество номеров, вы можете использовать:

#<a href="/en/browse/file/[0-9]+">(.*?)</a>#

Если должно быть только 5 цифр:

#<a href="/en/browse/file/[0-9]{5}">(.*?)</a>#

Если оно должно иметь от 3 до 6 цифр:

#<a href="/en/browse/file/[0-9]{3,6}">(.*?)</a>#

Если оно должно иметь более 2 чисел:

#<a href="/en/browse/file/[0-9]{2,}">(.*?)</a>#
0 голосов
/ 14 июля 2010

Следует помнить, что регулярное выражение возвращает все, что вы искали, если оно соответствует. Вам нужно указать, что нужно заботиться только о той части, которую вы заключили в круглые скобки (текст привязки). Я не уверен, на каком языке вы используете регулярное выражение, но вот пример в Ruby:

string = '<a href="/en/browse/file/variable_text">i_want_this</a>'
data = string.match(/<a href=\"\/en\/browse\/file\/variable_text\">(.*?)<\/a>/)
puts data # => outputs '<a href="/en/browse/file/variable_text">i_want_this</a>'

Если вы указываете, что вы хотите в скобках, вы можете сослаться на это:

string = '<a href="/en/browse/file/variable_text">i_want_this</a>'
data = string.match(/<a href=\"\/en\/browse\/file\/variable_text\">(.*?)<\/a>/)[1]
puts data # => outputs 'i_want_this'

В Perl вы будете использовать $ 1 вместо [1], например:

$string = '<a href="/en/browse/file/variable_text">i_want_this</a>';
$string =~ m/<a href=\"\/en\/browse\/file\/variable_text\">(.*?)<\/a>/;
$data = $1;
print $data . "\n";

Надеюсь, это поможет.

0 голосов
/ 14 июля 2010

Не используйте регулярные выражения для разбора HTML. Используйте DOM-парсер. Укажите также язык, который вы используете.

Так как он находится в захваченной группе и вы заявляете, что он совпадает, вы сможете ссылаться на него через $1 или \1 в зависимости от языка.

$blah = preg_match( $pattern, $subject, $matches );
print_r($matches);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...