如何在从末尾匹配的字符串中获取模式的位置

时间:2013-12-18 13:45:33

标签: php

$a = "this is school of sachin";
$pattern = "sch";

我想从最后得到匹配模式的位置。例如,在这种情况下,sch匹配school - 因此模式的位置应为3,即从结尾开始:

如下所述,单词school的索引是以这种方式排列的,所以如果sch的匹配成功,则匹配从匹配(学校)的单词结尾到开头的位置应该返回模式(从结尾)。

s c h o o l
5 4 3 2 1 0

^---^

匹配模式。

我已经尝试strpos(),但无法满足我的目的。

echo strpos($a, $pattern); // this is wrong 

根据我的问题,strpos()的输出应为3。

4 个答案:

答案 0 :(得分:2)

<?php
$a = "this is school of sachin";
$pattern = "sch";
$words = explode(" ", $a);
$pattern = strrev($pattern);
foreach($words as $word){
$pos = strpos(strrev($word), $pattern);
    if($pos !== false){
    print($pos);
    break;
    }
}
?>

<?php
$a = "this is sachinùs school of sachin";
$pattern = "sach";
if(preg_match("/[^ [:punct:]]*".$pattern."([^ [:punct:]]*)/u", $a, $match)){
print(mb_strlen($match[1], "UTF-8"));
    if($pattern == $match[0]){
    print(" (full word)");
    }
}
?>

答案 1 :(得分:1)

没有Sharanya提出的整个方法

$haystack = 'this is a verygood school of sachin';
$pattern = 'sch';

$match = strstr($haystack, $pattern);

for ($i = 0;$i < strlen($match);$i++) {
    if ($match[$i] == ' ') {
        $match = substr($match, 0, $i);
        break;
   }
}
$result = strlen($match) - strlen($pattern);
echo $result;

请注意,它会从左侧开始发现FIRST事件,因此例如'schschool'将输出6。

答案 2 :(得分:1)

注意 - 这也会告诉您找到的单词是否为完整单词
看看 - http://3v4l.org/i94Lr

  $pattern = "sch";
  $b = explode(' ','this is school of sachin');
  $b = array_reverse($b);
  for($i=0;$i < count($b);$i++){
     if(strpos($b[$i],$pattern) !== false){
       echo $i+1;
       $full = ', not a full word';
       if($b[$i] == $pattern){
         $full = ', full word';
       } 
       echo $full;
       break;
     }
  }

答案 3 :(得分:1)

使用带有word boundaries\b)的正则表达式查找与提供的模式匹配的单词,然后使用捕获组捕获模式后的所有内容。然后,只需返回该字符串的长度:

$a = "this is school of sachin";
if (preg_match('/\b(sch(\w+))\b/', $a, $matches)) {
    echo strlen($matches[2]); // => 3
}

如果您还想考虑非英文字符,则可以使用u修饰符:

$a = "this is sachinùs school of sachin";
if (preg_match('/\b(sch(\w+))\b/u', $a, $matches)) {
    echo strlen($matches[2]); // => 3
}