1

我尝试选择一些以.domain 结尾的名称

文件文本如下:

.
..
script
truc.domain
machin.domain

例如,我想选择truc.domainmachin.domain

我试试这个

if (preg_match('~$.domain~', $result)){
    echo $result;
}

或者

if (preg_match('/$.domain/', $result)){
    echo $result;
}

但它不起作用...

我的第二个问题是在很多例子中我看到 preg_match 和preg_match('/filter/)preg_match('~filter~')

/~和有什么不一样?

4

3 回答 3

2

您的正则表达式没有正确构建,如果您想返回匹配的文本,您必须提供第三个参数才能preg_match运行。

如果你想匹配行尾,你的正则表达式必须是这样的:

 if (preg_match('/(.*)\.domain$/', $search_text, $result)){
     echo $result[0]; //Note this is an array, that matches all the pattern
     echo $result[1]; // This is the match of the first subgroup
 }
于 2013-06-11T09:02:48.483 回答
2

~并且/都是正则表达式允许的分隔符,您可以使用大约。除了空间之外的任何一个。

.表示任何字符,要匹配一个点,您需要对其进行转义

$表示行尾,因此您的正则表达式应如下所示:

/\.domain$/
于 2013-06-11T09:04:54.510 回答
2

/和之间没有区别~。您可以从多种分隔符中进行选择。这个想法是你可以选择一个不属于你的模式的字符,所以你不必逃避任何东西。例如,如果您想匹配3/4/用作分隔符,则必须编写/3\/4/,但~可以编写~3/4~.

关于您的问题,您必须将锚放在应该匹配的位置。因为它是字符串的末端锚,所以它在末端。您可能还想转义.或将其放入字符类中。否则它将匹配任何字符:

/[.]domain$/

请注意,您的匹配项将仅包含.domain. 如果您希望整个“名称”以结尾,.domain则需要将其包含在模式中。我不知道您将什么定义为名称,但如果我们使用“字母数字和下划线”,即单词字符的正则表达式定义,您可以简单地\w+在前面添加尽可能多的“单词”的.domain

最后,由于您似乎想要找到 this 的多个实例,并且在行结尾而不是字符串结尾,您需要使用preg_match_allandm修饰符,它也使$匹配行结尾:

if(preg_match_all('/\w+[.]domain$/m', $input, $matches))
{
    print_r($matches[0]);
}

那将打印

Array
(
    [0] => truc.domain
    [1] => machin.domain
)

工作演示。

获取句点前面的部分,您可以在处获得explode()这些结果.,也可以捕获名称:

if(preg_match_all('/(\w+)[.]domain$/m', $input, $matches))
{
    print_r($matches[0]);
    print_r($matches[1]);
}

将打印

Array
(
    [0] => truc.domain
    [1] => machin.domain
)
Array
(
    [0] => truc
    [1] => machin
)

工作演示。

于 2013-06-11T09:06:17.527 回答