获取字符串之间的字符串向量(Php)

时间:2014-01-27 21:20:08

标签: php regex string

我已经尝试了几个小时来获取由"{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 / / / / / / / / / / / / / / / / / / / / / / /

2 个答案:

答案 0 :(得分:3)

请记住,{x}(其中x是整数)是正则表达式中的重复运算符。 E.g。

/foo{7}/

将匹配

foooooooo
  1234567

fo,然后又增加了7个oo{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来转义字符以解决此问题。