PHP在文本中查找字符串

时间:2016-02-18 13:17:54

标签: php regex string find

使用以下内容在文本中查找字符串(使用PHP)的最佳/最简单方法是什么:

  • 任何特殊字符
  • 字符串边界(空格)
  • 不区分大小写

一些例子:

$text = "This is a test èsàdò string123?"; 
$find = "èsàDò"; 

将返回true

$text = "This is a test èsàdò string123?"; 
$find = "a TEST èsàdò";

将返回true

$text = "This is a test èsàdò string123?";
$find = "string123";

将返回true

$text = "This is a test èsàdò string123?";
$find = "string12";

将返回false

$text = "This is a test èsàdò string123?";
$find = "This is a test èsàdò String123?";

将返回true

5 个答案:

答案 0 :(得分:0)

在你的'边界'/分隔符处爆炸,然后遍历数组并返回第一场比赛。

$array = explode(" ", $string);
foreach($array as $array_item){
    if (stripos($array_item, 'èsàdò') !== false) {
        return true;
     }
}

答案 1 :(得分:0)

您可以使用像preg_match或preg_match_all

这样的正则表达式函数

示例:

示例: 编辑:(感谢ThomasGhesquière在下面找到了一个工作模式)

function test($string,$pattern){
   return (preg_match("/\b({$pattern})\b/ui","".trim($string)."",$res)) ? "Found" : "Not found";

}



$text = "This is a test èsàdò string123?"; 
$find = "èsàDò"; 
echo test($text,$find) . "\n";


$text = "This is a test èsàdò string123?"; 
$find = "a TEST èsàdò";
echo test($text,$find) . "\n";


$text = "This is a test èsàdò string123?";
$find = "string123";
echo test($text,$find) . "\n";


$text = "This is a test èsàdò string123?";
$find = "string12";
echo test($text,$find) . "\n";


$text = "This is a test èsàdò string123?";
$find = "This is a test èsàdò String123?";
echo test($text,$find) . "\n";  

将返回true为false,具体取决于$ text和$ find。在这里它将返回true。 http://php.net/manual/fr/function.preg-match.php

sizrar @ ovador:〜$ php test.php

实测值

实测值

实测值

未找到

实测值

你可以看到结果几乎可以(你的最后一个例子还有一些调整,但主要原则是那里) 在这种特殊情况下,您可以轻松地排除测试函数中的相等情况。但要确定要使用的正则表达式,您可以使用en在线测试器,如:https://regex101.com/并相应地编译preg_match的第一个参数

答案 2 :(得分:0)

使用正则表达式的\b字分隔符和u匹配重音字符。

$text = "This is a test èsàdò string123?";
$find = "èsàDò";
// remove trailing punctuations from $find
// punctuations inside the string are not affected
$find = preg_replace('/([[:punct:]]+)$/iu', '', $find);
// escape any regex specific character
$find = preg_quote($find);

if (preg_match("/\b({$find})\b/ui", $text)) {
    echo "match";
} else {
    echo "no match";
}

答案 3 :(得分:0)

由于你没有定义你所谓的" boundary",我假设(从你的测试中)它意味着搜索的子串可以用空格,标点字符和字符串的限制包围。为了表达我使用负面的外观:

  • (?<![^\s\pP]) (不包含不是空格或标点字符的字符)
  • (?![^\s\pP]) (后面跟不是空格或标点字符的字符)

请注意,我使用负面外观(而不是(?<=[\s\pP])(?=[\s\pP]))隐式包含搜索字符串在字符串的一个限制处开始或结束的情况。换句话说:

  • (?<![^\s\pP])&lt; =&gt; (?<=[\s\pP]|^)
  • (?![^\s\pP])&lt; =&gt; (?=[\s\pP]|$)

代码:

$text = 'This is a test èsàdò string123?'; 
$needles = ['èsàDò', 'a TEST èsàdò', 'string123', 'string12', 'This is a test èsàdò String123?'];

$format = " %-35s\t%s%s";
echo 'TEST STRING: ', $text, PHP_EOL, PHP_EOL;
printf($format, 'needle', 'result', PHP_EOL);
echo str_repeat('-', 50), PHP_EOL;

foreach ($needles as $needle) {
    $pattern = '~(?<![^\s\pP])' . preg_quote($needle, '~') . '(?![^\s\pP])~iu';
    printf($format, $needle, (preg_match($pattern, $text) ? 'true' : 'false'), PHP_EOL);
}

结果:

TEST STRING: This is a test èsàdò string123?

 needle                                 result
--------------------------------------------------
 èsàDò                                  true
 a TEST èsàdò                           true
 string123                              true
 string12                               false
 This is a test èsàdò String123?        true

答案 4 :(得分:-1)

要匹配以下任何内容:

  • 任何特殊字符
  • 字符串边界(空格)
  • 不区分大小写

我会调查preg_match preg_match

使用正则表达式,您可以搜索匹配特殊字符或字符串boudaries的任何字符串,如果使用i标志设置它将不区分大小写。

例如: preg_match("/([èsàDò\b]+)/i"'This is a test èsàdò string123?',$matches) 这将检索$ matches数组中的任何匹配,或者只返回布尔值true / false:

if(preg_match("/[èsàDò\b]+/i"'This is a test èsàdò string123?')){
[CODE HERE]
}