2009-05-06 2 views
29

Мне нужна помощь по регулярному выражению или preg_match, потому что я не настолько опытен, но в отношении тех, вот моя проблема.PHP/regex: Как получить строковое значение HTML-тега?

Мне нужно получить значение «получить меня», но я думаю, что моя функция имеет ошибку. Число тегов html является динамическим. Он может содержать много вложенных тегов html, как жирный тег. Кроме того, значение «получить меня» является динамическим.

<?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; 
?> 
+0

возможно дубликат [Можете ли вы привести несколько примеров того, почему трудно разобрать XML и HTML с регулярных выражений?] (HTTP: //stackoverflow.com/questions/701166/can-you-provide-some-examples-of-why-it-is-hard-to-parse-xml-and-html-with-a-rege) –

+0

Возможный дубликат [RegEx сопоставить открытые теги, кроме XHTML автономных тегов] (http://stackoverflow.com/questions/1732348/regex-match-open-ta gs-except-xhtml-self-contains-tags) –

ответ

58
<?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; 
?> 

Это должно сделать трюк

+1

Идентификатор открытия должен быть сопоставлен с использованием <$tagname.*?> или <$tagname[^>] *>, а не <$ tagname?. *>. Как бы то ни было, он жадный и будет соответствовать намного дальше, чем вы надеялись, если в строке есть более одного закрывающего тега. –

+0

Это работало. Большое спасибо takete.dk: D – marknt15

+0

@Samir: Спасибо за подсказку, я попробую. – marknt15

8

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

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

спасибо ... awesome – mostafaznv

0

Следующие фрагменты 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); 

Это возвращает "Some Text".

С уважением,

Web-Farmer @ letsnurture.com

2

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

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

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

8

Попробуйте

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

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

print_r($foo[1]); 
+6

да, я знаю, но предыдущий ответ не работает на 100% корректно.вчера у меня такая же проблема, и я пробую предыдущий ответ, но они показывают только одно значение тега, не идущее на следующий тег. Я исправляю эту ошибку и отправляю правильный ответ для новых пользователей. – pkwebmarket

0
$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

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

+0

Благодарим за сообщение ответа на этот вопрос! Ответы только на код не поощряются при переполнении стека, поскольку дамп кода без контекста не объясняет, как и почему решение будет работать, что затрудняет первоначальный плакат (или любые будущие читатели), чтобы понять логику этого. Пожалуйста, отредактируйте свой вопрос и включите объяснение своего кода, чтобы другие могли воспользоваться вашим ответом. Благодаря! –

Смежные вопросы