Заменить текст, используя соответствие не жадным способом? - PullRequest
1 голос
/ 16 июня 2011

У меня есть вызов SOAP, который выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="urn:FileserveAPI" xmlns:types="urn:FileserveAPI/encodedTypes" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><tns:login><username xsi:type="xsd:string">REPLACEME</username><password xsi:type="xsd:string">REPLACEMETOO</password></tns:login></soap:Body></soap:Envelope>

Я хочу заменить REPLACEMEE и REPLACEMETOO на определенные значения, но в теме эти значения могут быть любыми.

Iпробовал эти правила preg_match:

$body = preg_replace('#>.+?</username>#','>myuser</username>',$body);
$body = preg_replace('#>.+?</password>#','>mypw/username>',$body);

Но я получаю следующую строку:

<?xml version="1.0" encoding="utf-8"?>myuser</username></tns:login></soap:Body></soap:Envelope>

Не могу понять, почему?

Почему это происходит и как мне нужно изменить мои правила?

Редактировать:

Я уже работал над этим с помощью класса отрицательных символов, такого как [^>]+однако я все еще интересуюсь, почему не жадность не работает.

Ответы [ 2 ]

1 голос
/ 16 июня 2011

«Нежадность» работает, как и ожидалось.

Первое регулярное выражение начиналось, когда встречалось >, и затем принимало только минимум, пока не было достигнуто первое </username>.

ЕслиXML был:

<?xml version="1.0"><accnt1><username>foo</username></accnt1><accnt2><username>bar</username></accnt2> ...


Затем >.+?</username> захватывает:

><accnt1><username>foo</username>


Принимая во внимание, что >.+</username> будет захватывать:

><accnt1><username>foo</username></accnt1><accnt2><username>bar</username>
1 голос
/ 16 июня 2011

Попробуйте:

$body = preg_replace("/(<username[^>]+>).+?(<\/username>)/", "$1new value$2", $input);
$body = preg_replace("/(<password[^>]+>).+?(<\/password>)/", "$1new value..$2", $input);
...