PHP / regex: как получить строковое значение тега HTML? - PullRequest
34 голосов
/ 06 мая 2009

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

Мне нужно получить значение "get me", но я думаю, что моя функция имеет ошибку. Количество тегов HTML являются динамическими. Он может содержать много вложенных HTML-тегов, таких как жирный тег. Кроме того, значение "get me" является динамическим.

<?php
function getTextBetweenTags($string, $tagname) {
    $pattern = "/<$tagname>(.*?)<\/$tagname>/";
    preg_match($pattern, $string, $matches);
    return $matches[1];
}

$str = '<textformat leading="2"><p align="left"><font size="10">get me</font></p></textformat>';
$txt = getTextBetweenTags($str, "font");
echo $txt;
?>

Ответы [ 7 ]

66 голосов
/ 06 мая 2009
<?php
function getTextBetweenTags($string, $tagname) {
    $pattern = "/<$tagname ?.*>(.*)<\/$tagname>/";
    preg_match($pattern, $string, $matches);
    return $matches[1];
}

$str = '<textformat leading="2"><p align="left"><font size="10">get me</font></p></textformat>';
$txt = getTextBetweenTags($str, "font");
echo $txt;
?>

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

9 голосов
/ 22 января 2012

Попробуйте это

$str = '<option value="123">abc</option>
        <option value="123">aabbcc</option>';

preg_match_all("#<option.*?>([^<]+)</option>#", $str, $foo);

print_r($foo[1]);
8 голосов
/ 06 мая 2009

В вашем шаблоне вы просто хотите сопоставить весь текст между двумя тегами. Таким образом, вы можете использовать, например, [\w\W] для сопоставления всех символов.

function getTextBetweenTags($string, $tagname) {
    $pattern = "/<$tagname>([\w\W]*?)<\/$tagname>/";
    preg_match($pattern, $string, $matches);
    return $matches[1];
}
2 голосов
/ 22 сентября 2009

Поскольку значения атрибутов могут содержать простой символ >, попробуйте следующее регулярное выражение:

$pattern = '/<'.preg_quote($tagname, '/').'(?:[^"'>]*|"[^"]*"|\'[^\']*\')*>(.*?)<\/'.preg_quote($tagname, '/').'>/s';

Но регулярные выражения не подходят для анализа нерегулярных языков, таких как HTML. Вам лучше использовать парсер, например SimpleXML или DOMDocument .

0 голосов
/ 07 августа 2015

попробуй $pattern = "<($tagname)\b.*?>(.*?)</\1>" и return $matches[2]

0 голосов
/ 11 января 2013
$userinput = "http://www.example.vn/";
//$url = urlencode($userinput);
$input = @file_get_contents($userinput) or die("Could not access file: $userinput");
$regexp = "<tagname\s[^>]*>(.*)<\/tagname>";
//==Example:
//$regexp = "<div\s[^>]*>(.*)<\/div>";

if(preg_match_all("/$regexp/siU", $input, $matches, PREG_SET_ORDER)) {
    foreach($matches as $match) {
        // $match[2] = link address 
        // $match[3] = link text
    }
}
0 голосов
/ 03 июля 2009

Следующие фрагменты php вернут текст между тегами / элементами html.

regex: "/tagname(.*)endtag/" будет возвращать текст между тегами.

т.е.


$regex="/[start_tag_name](.*)[/end_tag_name]/";
$content="[start_tag_name]SOME TEXT[/end_tag_name]";
preg_replace($regex,$content); 

Возвращается «НЕКОТОРЫЙ ТЕКСТ».

С уважением,

Веб-Farmer @ Letsnurture.com

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...