2013-04-12 29 views
-4

我想在一个特定的条件下在php中搜索文本文件:当第一次匹配字符串时,开始收集文本,当第二次匹配相同的字符串时,停止收集文本。通过正则表达式搜索字符串?任何更好的方法?

例如。如果字符串是“世界”并在下面搜索: '我们的世界有196个国家,但其中只有192个国家是联合国的成员。我们的世界是非常平凡的。“

然后我想要这个文本:'有196个国家,但只有192个是联合国的成员。我们'在匹配的变量。

我已经尝试了preg_match()中的很多正则表达式,但没有结果,所以有没有更好的方法来做到这一点?

感谢

+4

如果你告诉我们,你的正则表达式,我们可以尽力帮助 – Uby

+0

由约瑟夫一世给出的答案试过,正则表达式,但没有结果 –

+0

@Bhavin:你所说的“没有结果”是什么意思? - 约瑟夫包括它的工作示范。 – halfer

回答

0
$lines = file($filename); 
$keep = false; 
$keepTrailing = true; //Flag that decides wether to keep trailing capture segments or not. 
$extractions = array(); 
$current = ''; 
foreach($lines as $line){ 
    $parts = preg_split('/\bworld\b/i', $line); 
    $current .= $parts[0]; 
    for ($i = 1; $i<count($parts); $i++){ 
     if ($keep) $extractions[] = $current; 
     $keep = !$keep; 
     $current = $parts[$i]; 
    } 
} 
if ($keep && $keepTrailing) 
    $extractions[] = $current; 
var_dump($extractions); 

Here it is in action.

基本上,通过文件迭代一次,就可以简单地拆分各行中的关键词(“世界”) - 我用\b锚,以确保它没有对“世俗”或分拆其他垃圾。我已经添加了一个标志来决定是否保留尾随捕捉片段。你并不需要,但它可能会有所帮助。该解决方案唯一不直观的部分是将当前捕获保留在$current变量中,这基本上允许您在多个换行符中继续扫描。

你知道,这很容易做成一个函数。

function capturingSearchWithKeyword($filename, $keyword, $keepTrailing = true, $trim = false){ 
    $lines = file($filename); 
    $keep = false; 
    $extractions = array(); 
    $current = ''; 
    foreach($lines as $line){ 
     $parts = preg_split("/\\b$keyword\\b/i", $line); 
     $current .= $parts[0]; 
     for ($i = 1; $i<count($parts); $i++){ 
      if ($keep){ 
       if ($trim) $current = trim($current); 
       $extractions[] = $current; 
      } 
      $keep = !$keep; 
      $current = $parts[$i]; 
     } 
    } 
    if ($keep && $keepTrailing) 
     $extractions[] = $current; 
    return $extractions 
} 

Check it out...

+0

这就是我正在寻找的答案。我会根据需要对其进行修改,非常感谢 –

2

使用回顾后与前瞻:

/(?<=world).*?(?= world)/ 

在这里看到它在行动:http://regex101.com/r/tW2bT8


...这是一个演示使用PHP:http://codepad.viper-7.com/DucTKE

+0

是的,我试过了,它会在这个例子中工作,但不是在我的文本因为。我的实际文本包含的不仅仅是这些。即很多 - ,.?和所有这一切。我想在特定的字符串之间获取文本。 –

+0

顺便说一句,感谢您的regex101链接,现在我可以尝试很多正则表达式 –

+0

我的实际文字太长,在这里发表 –

相关问题