正则表达式 - 从上一个开始替换>到标记

时间:2015-08-18 18:45:27

标签: php regex wordpress

最重要的是:我的英语不是那么好,所以...如果你们不能理解我,我想请求道歉:)

所以,这就是我正在寻找的: 我正在使用Wordpress插件生成XML(WP ALL EXPORT)。好。

现在,我需要打开一个文件并编辑一些东西。我开始时:

$data = file_get_contents("1439828483.xml");

现在我正在使用str_replace和preg_replace来更新我需要的行。

我有两个这样的XML标记:

<cidade><![CDATA[sao-paulo>santo-andre]]></cidade>
<bairro><![CDATA[sao-paulo>santo-andre]]></bairro>

你看到内容是一样的......但是因为我有一个&#34;&gt;&#34;字符拆分2件事。

<cidade></cidade>标记中,我只需保留之前的内容&#34;&gt;&#34;。 在<bairro></bairro>标记中,我只需要保留&#34;&gt;&#34;之后的内容。

对于第二个问题,我修复了这个问题:

$data = preg_replace('#(<bairro>).*?(>)#', '$1$2', $data);
$data = str_replace('<bairro>>', "<bairro><![CDATA[",$data);

结果是:

<bairro><![CDATA[santo-andre]]></bairro>

好的,我有内容,但它仍然有连字符(短划线),现在我无法修复它(不知道如何)。我真正需要的是:

<bairro><![CDATA[santo andre]]></bairro>

当然,对于标签<cidade></cidade>,我需要:

<cidade><![CDATA[sao paulo]]></cidade>

在发布之前,我发现了这个主题: Regex between, from the last to specific end

但我试图编辑anubhava和Jack Maney答案的某些部分,但我失败了:(

当我使用preg_replace和str_replace时,我不知道正则表达式字符串是否有一些限制。

谢谢,我希望你们能理解我:D

2 个答案:

答案 0 :(得分:1)

这样做(并替换你自己的修复):

$data = preg_replace('#(<bairro><!\[CDATA\[)[^>]*?>([^>]*?><)#', '$1$2', $data);
while(preg_match('#(<bairro>[^->]*?)-([^->]*?-)*([^->]*?'.'>)#', $data)) {
    $data = preg_replace('#(<bairro>[^->]*?)-(([^->]*?-)*)([^->]*?'.'>)#', '$1 $2$4', $data);
}
$data = preg_replace('#(<cidade><!\[CDATA\[[^>]*?)>[^>]*?(\]\]><)#', '$1$2', $data);
while(preg_match('#(<cidade>[^->]*?)-([^->]*?-)*([^->]*?'.'>)#', $data)) {
    $data = preg_replace('#(<cidade>[^->]*?)-(([^->]*?-)*)([^->]*?'.'>)#', '$1 $2$4', $data);
}

答案 1 :(得分:0)

我要指出parsing XML with regex is often a bad idea,部分是因为你发现的原因。但是,如果您只想用空格替换连字符,只需执行以下操作:

$data = str_replace_all('-', " ", $data);

这将替换输入中的所有连字符,当然,请确保您知道其中的内容。