无法获取preg_replace来删除一些数字

时间:2014-08-20 15:35:33

标签: php xml regex preg-replace

我使用来自Web服务的__getLastResponse对象上的SoapClient函数提取了一个String。

这个字符串是XML文档的格式,除了它在开始时有一些不必要的数字,我需要删除它才能将它解析为XML。

我已经编写了一个preg_replace函数来删除这些数字,但它不起作用;有人可以解释一下原因吗?

以下是相关代码:

$string = $search_client->__getLastResponse();

$string = preg_replace('/\A^\d+\', '', $string);

初始字符串的开头时间为234682374643<records xmlns="http://scien...</records>等,我正在尝试<records xmlns="http://scien...</records>

感谢您的帮助。

**其他1 **

如果我输入$string = preg_replace("/\d+/", "", $string);,那么它会删除字符串中的所有数字,所以我知道其他所有数据都正常工作,只是因为某种原因而没有删除其他模式的模式数字,只是第一个。)

**其他2 **

这是$search_response stdClass对象,它是已启动的Soap Client对象的print_r,其上调用了search($params)函数:

stdClass Object
(
[return] => stdClass Object
    (
        [queryId] => 1
        [recordsFound] => 3670
        [recordsSearched] => 38802522
        [records] => 
WOS:A1993LC481000015-&BRESINSKY, ABRESINSKY,... etc ...
    )
)

正如您所见,我从__getLastResponse中提取的字符串包含所有值为一个字符串,其数字为“1367038802522”,后跟“记录”值。正是这些数字我试图摆脱,因为我相信我将能够将剩余的String解析为XML,可能是使用SimpleXmlElement。

4 个答案:

答案 0 :(得分:1)

^之后您还有\A。像这样使用它:

$string = preg_replace('/\A\d+/', '', $string);

答案 1 :(得分:1)

删除\A

后再试一次
$re = "/^\\d+/";
$str = "234682374643<records xmlns=\"http://scien...</records>";
$subst = '';

$result = preg_replace($re, $subst, $str);

查看online demo

答案 2 :(得分:1)

\A^执行相同的操作(主题的开头),类似于\Z$(主题的结尾)。

同时\A^会打破匹配。

您的分隔符也已关闭。

尝试:

$string = "123foo";
$string = preg_replace('/^\d+/', '', $string);
var_dump($string); // "foo"

答案 3 :(得分:0)

感谢大家的帮助。

发现为什么在我运行Halcyon发布的测试时发生了这种情况,他建议输入可能不像我想的那样。事实证明,无论何时print_rvar_dump__getLastResponse,它只是显示值并错过了出现在字符串之前的一堆标记,即:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:searchResponse xmlns:ns2="http://woksearch.v3.wokmws.thomsonreuters.com"><return><queryId>1</queryId><recordsFound>3670</recordsFound><recordsSearched>38802522</recordsSearched><records>... etc...</records>

这是实际返回的内容,而不是显示的1367038802522前缀。如您所见,这些数字是上述标签中的所有值。我通过应用htmlspecialchars($search_client->__getLastResponse());显示以前隐藏的&#39;来获得此输出。字段。

虽然有些奇怪,但我不确定为什么这样做是因为所有内容都会在<records>标记之后正确显示,之后所有开始标记都会显示{{{ 1}})显示为<。因此,在&lt;标记之前,它会正确显示<records>,然后显示<代替!