Текст привязки к регулярному выражению для ссылки

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

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

Я хочу только текст привязки для ссылки: "i_want_this"

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

Я использую этот regex:

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

Это соответствует, конечно, полной ссылке.

1
задан RafaelM 25 February 2016 в 22:24
поделиться

7 ответов

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

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

для большей ясности, вам нужно следующее:

  1. любой символ, любой количество раз (regex =. *)

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

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

1
ответ дан 2 September 2019 в 23:05
поделиться

Следует помнить, что регулярное выражение возвращает все, что вы искали, если оно совпадает. Вам нужно указать, что заботится только о той части, которую вы заключили в круглые скобки (текст привязки). Я не уверен, на каком языке вы используете регулярное выражение, но вот пример на 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
ответ дан 2 September 2019 в 23:05
поделиться

Я не уверен на 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
ответ дан 2 September 2019 в 23:05
поделиться

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

Где:

$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
ответ дан 2 September 2019 в 23:05
поделиться

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

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

$blah = preg_match( $pattern, $subject, $matches );
print_r($matches);
0
ответ дан 2 September 2019 в 23:05
поделиться

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

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

здесь говорится, что берите КАЖДОЕ, что найдете, пока не встретите "

[^"]*

то же самое! берите с собой все, пока не встретите <

[^<]*

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

([^<]*)

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

Удачи!

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

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

Я использую

[^<]* 

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

.*? 

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

[^<]*
0
ответ дан 2 September 2019 в 23:05
поделиться

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

0
ответ дан 2 September 2019 в 23:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: