如何使用preg_match()或其他方式找到确切的数字或单词

时间:2019-09-09 02:56:56

标签: php regex

很多时间没有在网上找到一些示例之后,我来到这里...所以,我正在使用以下代码查找确切的单词:

preg_match("/\b".$searched."\b/i", file_get_contents("mytextfile1.txt"))

这对字母/字符正常工作,但是当我使用nuber作为005、087、172时,IF条件始终返回FALSE ...,下面是两个示例:

工作示例:

$searched = "someword";
if ( preg_match("/\b".$searched."\b/i", file_get_contents("mytextfile1.txt")) ) {
// TRUE
}

非工作示例:

$searched = "047";
if ( preg_match("/\b".$searched."\b/i", file_get_contents("mytextfile1.txt")) ) {
// FALSE
}

.TXT文件包含许多这样的字符串:

somenametofind|alinktoimages_icon_047_00.png|some-text

请,您能告诉我该正则表达式有什么问题吗?我该如何解决呢? 希望您能理解我的问题...非常感谢。 :)

1 个答案:

答案 0 :(得分:3)

您的问题是\b匹配任何非单词字符,即[^A-Za-z0-9_]。请注意,_ 被认为是文字字符,因此\b047\b将不匹配_047_。如果要从“单词”中排除_,请将正则表达式更改为

"/(^|[^A-Za-z0-9])$searched([^A-Za-z0-9]|$)/i"

Demo on 3v4l.org

如果要允许单词包含_,则在搜索数字时更改边界可能会更简单。例如:

$string = 'somenametofind|alinktoimages_icon_047_00.png|some-text';
$searched = array("some-text", "047");
foreach ($searched as $s) {
    $b = is_numeric($s) ? '\D' : '\b';
    if (preg_match("/$b$s$b/i", $string) ) {
        echo "found $s\n";
    }
}

输出:

found some-text
found 047

Demo on 3v4l.org