选择破折号后面的单词,而不是单词后面的任何内容

时间:2014-05-10 17:20:54

标签: php regex

我们说我有几个这样的文件

font-normal.otf
font-bold.ttf
etc

我想在破折号后选择这个词,也就是"普通"就是这样。不是.orf。我怎么能这样做?

我有这个,但它也选择.otf部分。

[^-]+$

3 个答案:

答案 0 :(得分:2)

正则表达式的问题在于[^-]+匹配所有内容(连字符除外)直到行尾,而您只想匹配-.

使用以下正则表达式:

/^.*?([^-]+)\..*$/m

说明:

  • ^ - 在行的开头断言位置
  • .*? - 匹配除换行符之外的所有字符(懒惰)
  • ([^-]+) - 匹配(并捕获)另外一个非连字符
  • \. - 匹配文字圆点字符(.
  • .* - 匹配其他所有内容,直到行尾(贪婪)
  • $ - 在行尾声明位置

  • m - 多行修饰符(使^$在每行的开头和结尾匹配)

代码:

preg_match_all('/^.*?([^-]+)\..*$/m', $text, $matches);
print_r($matches[1]);

输出:

Array
(
    [0] => normal
    [1] => bold
)

Regex101 Demo

答案 1 :(得分:1)

如果您只是想保持简单,可以选择

 $str = file_get_contents("test.txt"); // your file names in test.txt (or pass them with string if you want...)
 $string2 = preg_match_all('/-([\w ]+)/', $str, $matches);

现在$ matches [1]数组包含 - 和之间的所有字符串。 (如果它们只是单词字符;如果您需要数字和其他字符,您可以使用适当的regex更改\ w。

使用它来获得正常的'并且'大胆'从你的例子中打印出来。

echo $matches[1][0];
echo $matches[1][1];

答案 2 :(得分:0)

这应该足够简单-([^.]+) Demo

编辑:

  • -匹配破折号
  • (抓捕小组
    • [^.]任何不是文字点的内容
    • +贪婪
  • )关闭捕获小组
相关问题