如何在PHP中向后搜索字符串?

时间:2015-02-04 13:15:29

标签: php

$str="This is a string with <xref cite@#>test</xref> and 
<xref cite@#>string2</xref>";

我需要在“@#&gt; test”和“xref”之间输入字符串。

我试过了:

$start=strpos($str,"@#>test");
$end=strpos($str,"xref ",$start); //here how to search backwards from  "@#>test"
//to "xref "

预期输出

strrpos - 仅用于获取字符串的最后一次出现。是否有任何函数从指定的位置向后搜索字符串?

3 个答案:

答案 0 :(得分:1)

试试这个: by regex (?<=xref).*(?=@#)

$re = "/(?<=xref).*(?=@#)/m";
$str = "This is a string with <xref cite@#>test</xref> and \n<xref cite@#>test</xref>";

preg_match_all($re, $str, $matches);

[现场演示] [1]

更新: (?<=<xref).*?(?=@#)

$re = "/(?<=<xref).*?(?=@#)/m";
$str = "This is a string with <xref cite@#>test2</xref> and <xref cite@#>test1</xref><xref cite@#>test</xref><xref cite@#>test1</xref>\n<xref cite<e.g.>[p.11]@#>test</xref>";

preg_match_all($re, $str, $matches);

Update link

答案 1 :(得分:1)

没有从指定位置向后搜索的功能,但一个简单的解决方法是使用substr截断所需位置的输入,然后使用strrpos

$truncated = substr($str, 0, $start);
$end = strrpos($truncated, "xref ");

然而,看起来正则表达式对于这种不太直接的模式匹配来说可能是更方便的选择。

答案 2 :(得分:0)

http://php.net/manual/en/function.strrpos.php

  

如果值为负数,则搜索将从字符串末尾的那么多字符开始,向后搜索。

因此,如果您为偏移量提供负数,则可以向后搜索。这应该工作

$end=strpos($str,"@#>test");
$start=strpos($str,"xref ",$end-strlen($str)); 
$output=substr($str,$start, $end-$start);