我已经尝试了几个小时来获取由"{i}"
和"{[i]}"
分隔的字符串,例如在{i}Esse{[i]}
中,其中i
是一个整数。基于
get string between 2 strings。我不知道它发生了什么,所以我决定寻求帮助。
我的代码是:
<?php
include "keepGetInBetweenStrings.php";
$x['city1']='Esse';
$x['city2']='';
$x['city3']='é';
$x['city4']='um bom exemplo de';
$x['city5']=' uma portuguese-string!!';
$allCities='';
$cont=0;
for($i=1;$i<=5;$i++){
if($x['city'."$i"]!=''){
$cont=$cont+1;
$allCities=$allCities.'{'."$cont".'}'.$x['city'."$i"].'{['."$cont".']}';
}
}
echo $allCities;
echo "<br>";
for($i=1;$i<=5;$i++){
$token=getInbetweenStrings('{'."$i".'}', '{['."$i".']}', $allCities);
echo $token."<br>";
}
?>
<?php
function getInBetweenStrings($start, $end, $str){
echo $start."<br>";
echo $end."<br>";
$matches = array();
$regex = "/$start(.*)$end/";
preg_match_all($regex, $str, $matches);
return $matches[0];
}
?>
我真的很感激任何帮助。
输出
{1}Esse{[1]}{2}é{[2]}{3}um bom exemplo de{[3]}{4} uma portuguese-string!!{[4]}
{1}
{[1]}
{2}
{[2]}
{3}
{[3]}
{4}
{[4]}
{5}
{[5]}
pHP日志错误
[Mon Jan 27 19:08:20.406027 2014] [:error] [pid 2638] [client 127.0.0.1:50728] PHP警告:preg_match_all():编译失败:在/ var /中偏移2处不重复第8行的www / NetBeansProjects / NewPhpProject / keepGetInBetweenStrings.php [Mon Jan 27 19:08:20.406039 2014] [:error] [pid 2638] [client 127.0.0.1:50728] PHP注意:未定义的偏移量:0/9 / /// B B B B / / / / / / / / / / / / / / / / / / / / / / /
答案 0 :(得分:3)
请记住,{x}
(其中x是整数)是正则表达式中的重复运算符。 E.g。
/foo{7}/
将匹配
foooooooo
1234567
f
,o
,然后又增加了7个o
(o{7}
)。
换句话说,你实际上是将正则表达式元字符插入到正则表达式中,但不希望它们被视为正则表达式 - 这意味着你正在遭受与SQL注入攻击相当的正则表达式。
你需要首先preg_quote
你的价值观,这些价值观会逃脱这些元字符,并给你更多的东西
/foo\{7\}/ instead.
因此...
function getInBetweenStrings($start, $end, $str){
$regex = '/' . preg_quote($start) . '(.*)' . preg_quote($end) . '/';
etc...
}
答案 1 :(得分:1)
{...}
在正则表达式中具有特殊含义。从另一个问题复制的getInbetweenStrings
函数假定分隔符字符串不包含任何特殊的正则表达式字符。您需要使用preg_quote
来转义字符以解决此问题。