嗯,我知道有幾個類似的問題,但無法找到任何與此特定情況。preg匹配標籤之間的標籤之間的相同標籤
我拿了一個代碼,並根據我的需要調整它,但現在我創建了一個我無法修正的錯誤。
代碼:
$tag = 'namespace';
$match = Tags::get($f, $tag);
var_dump($match);
static function get($xml, $tag) { // http://stackoverflow.com/questions/3404433/get-content-within-a-html-tag-using-7-processing
// bug case string(56) "<namespaces>
// <namespace key="-2">Media</namespace>"
$tag_ini = "<{$tag}[^\>]*?>"; $tag_end = "<\\/{$tag}>";
$tag_regex = '/' . $tag_ini . '(.*?)' . $tag_end . '/si';
preg_match_all($tag_regex,
$xml,
$matches,
PREG_OFFSET_CAPTURE);
return $matches;
}
正如你所看到的,但如果該標籤被嵌套了一個錯誤:
<namespaces> <namespace key="-2">Media</namespace>
當它應該返回 '媒體',或即使在外面'<namespaces>'
,然後在裏面。
我試着添加「<{$tag}[^\>|^\r\n ]*?>
」,^\s+
,將*改成* *,以及其他一些在最好的情況下轉而只識別錯誤情況的東西。
也試過"<{$tag}[^{$tag}]*?>"
這給了空白,我想它會自行消失。
我是一個正則表達式的新手,我可以告訴解決這個問題只是需要添加不要讓一個新的標籤打開同一個類型。 或者我甚至可以對我的使用案例使用黑客答案,即排除內部文本是否有新的線條托架。
任何人都可以得到正確的語法嗎?
您可以查看這裏的文字摘錄:http://pastebin.com/f2naN2S3
提議的變更後:$tag_ini = "<{$tag}\\b[^>]*>"; $tag_end = "<\\/{$tag}>";
它的工作的例子的情況下,但不是這一個:
<namespace key="0" />
<namespace key="1">Talk</namespace>
因爲它導致:
<namespace key="1">Talk"
這是因爲數字和「和字母被認爲是在字邊界內。我怎麼解決這個問題?
目前正在努力:$ tag_regex = '/'。 $ tag_ini。 「[^ {$ tag_ini}] *?」 。 $ tag_end。 '/ SI'; – Cristo
如果您對此表示歉意,您可以評論它不是一個好問題的原因 – Cristo
但是,如果您嘗試使用正則表達式處理XML,那麼對於一個很好的描述和一個片段,可能會出現更多的關於此問題的提示。至於你爲什麼得到命名空間標籤,你沒有使用單詞邊界:'$ tag_ini =「<{$tag}\\b[^>] *>」;'。然而,這不會解決嵌套標籤的問題,你需要一個[遞歸正則表達式](http://www.regular-expressions.info/recurse.html)。不過,你最好使用DOM解析來解析標籤之間的內容。 –