PHP:如何使preg_match仅匹配第一次出现?

时间:2015-05-27 08:09:49

标签: php regex preg-match

preg_match($ pattern,$ subject,$ matches),$ matches似乎是所有匹配的数组,我只需要第一次出现的正则表达式模式,我希望匹配在找到后立即停止匹配并将其存储在$ matches中。可能吗?谢谢。

我不是在谈论贪婪的比赛(。*和。*?),一个例子如下,

if (isset($_POST['submit'])) {
$file_reference = $_POST['file_reference'];
$file_name = $_POST['file_name'];
$file_location = $_POST['file_location'];
$file_pdf = $_POST['file_pdf'];

if ($_FILES['file_pdf']['error'] == UPLOAD_ERR_OK)

{
    $ext = strtolower(pathinfo($_FILES['file_pdf']['name'],PATHINFO_EXTENSION));
    switch ($ext)
    {
        case'pdf':
            break;
        default:
            throw new InvalidFileTypeException($ext);
    }

    $targetfolder = "pdf/";

    $targetfolder = $targetfolder . basename($_FILES['file_pdf']['name']);

    if (move_uploaded_file($_FILES['file_pdf']['tmp_name'], $targetfolder)) {

        echo "The file " . basename($_FILES['file_pdf']['name']) . " is uploaded";

    } else {

        echo "Problem uploading file";

    }


    $sql = "INSERT INTO file (file_reference,file_name,file_location,file_pdf)
VALUES ('$file_reference','$file_name','$file_location','$file_pdf')";

    if ($conn->query($sql) === TRUE) {
        echo "New record created successfully";
    } else {
        echo "Error: " . $sql . "<br>" . $conn->error;
    }

}

我希望它只找到abcd而不是任何进一步的匹配,因为进一步的匹配对我来说没用,我认为需要更多的时间来处理。

3 个答案:

答案 0 :(得分:4)

我想你想要这样: -

<?php
$str = 'abcd,abed,abfd,abgd';
if(preg_match("/ab.d/",$str ,$matches) !== false){ // check any match found or not
    echo "match found:".$matches[0]; // when found print that match
}//after printing execution will stops successfully.
?>

输出: - https://3v4l.org/bErZL

答案 1 :(得分:3)

preg_match执行您想要的操作 - 在第一次匹配后停止,而不是preg_match_all,找到所有出现的内容。在您的示例中:

$str = 'abcd,abed,abfd,abgd';
preg_match("/ab.d/", $str, $match);
echo $match[0];//abcd
  

如果提供了匹配,那么它将填充搜索结果。 $ matches [0]将包含与完整模式匹配的文本,$ matches [1]将具有与第一个捕获的带括号的子模式匹配的文本,依此类推。

答案 2 :(得分:0)

您还可以继续使用T-Regx

echo pattern('ab.d')->match('abcd,abed,abfd,abgd')->first(); //abcd