2016-06-08 2 views
0

У меня есть XML в строку, как это:Как использовать переменные в preg_replace в шаблоне?

<a:b> 
    <a:c></a:c> 
    <a:c></a:c> 
</a:b> 

, и я хотел бы, чтобы удалить все данные внутри пространства имен «а».

Конечно, это можно сделать так:

/<\ba\b:.*?>.*?<\/\ba\b:.*?>/ 

Но в данном случае результата:

<a:c></a:c> 
</a:b> 

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

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

/<(\ba\b:.*?)>.*?<\/$1>/ 

Это не рабочий раствор используется только для представления идеи реализации.

Вся ваша помощь, идеи, ... очень приветствуются. Спасибо за ваш ответ заранее.

+4

Не следует использовать регулярное выражение для этого использовать XML-анализатор. – nickb

+1

Это одна из причин не использовать регулярные выражения с HTML/XML. Используйте парсер, http://stackoverflow.com/questions/3577641/how-do-you-parse-and-process-html-xml-in-php. – chris85

+0

OK! Я могу это сделать, но идея заключается не в использовании парсера XML ... –

ответ

0

Чтобы получить ответ на вопрос, вот сокращенный рабочий пример:

(?P<nodeOpen><a:(?P<nodeName>.*)>)(?P<data>.*)(?P<nodeClose><\/a:(?P=nodeName)>) 

Используется в коде PHP:

preg_match('#(?P<nodeOpen><a:(?P<nodeName>.*)>)(?P<data>.*)(?P<nodeClose><\/a:(?P=nodeName)>)#s', $xml, $matches); 

/* Produce : 

array(9) { 
    [0]=> 
    string(43) "<a:b> 
    <a:c></a:c> 
    <a:c></a:c> 
</a:b>" 
    ["nodeOpen"]=> 
    string(5) "<a:b>" 
    [1]=> 
    string(5) "<a:b>" 
    ["nodeName"]=> 
    string(1) "b" 
    [2]=> 
    string(1) "b" 
    ["data"]=> 
    string(32) " 
    <a:c></a:c> 
    <a:c></a:c> 
" 
    [3]=> 
    string(32) " 
    <a:c></a:c> 
    <a:c></a:c> 
" 
    ["nodeClose"]=> 
    string(6) "</a:b>" 
    [4]=> 
    string(6) "</a:b>" 
} 

*/ 

А потом CONCAT:

$emptyNode = $matches['nodeOpen'] . $matches['nodeClose']; 

можно ознакомиться живут здесь: https://regex101.com/r/xX1uZ9/2

Я также рекомендую вам удивительный разговор о удивительном Spiderman Хорди Боггиано доступна на YouTube (https://www.youtube.com/watch?v=ayo8zDnd-m8)

+0

Большое спасибо за ваш ответ! –

+0

Пожалуйста, имейте в виду, что это быстрое взрывное решение для труднопроходимого решения. Опять же, если производительность не является проблемой сейчас, вы определенно должны использовать XML-парсер !!! Не шутите, просто сделайте это. – JesusTheHun

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