我有这句话
C:''wamp''www''callCenter''joomlatools-files''docman-files''test.pdf
我想得到正则表达式压缩测试的结果,但不使用句子中的另一个单词。
我的正则表达式是~'''(.+)'.pdf~
,但结果是wamp'www'portail-callcenter'joomlatools-files'docman-files'test
。有人能解释一下怎么做吗?
我不确定你想得到什么。但我想你想从你的第一句话中得到test
这个词。所以使用这个模式:
~''''('w+)'.pdf$~
然后是包含您需要的内容的$1
。
在线演示
~
分隔符''''
从字面上匹配两个反斜杠(
捕获组$1
(其中包含您需要获得的内容)'w+
匹配一个或多个字母、数字或下划线'.
与点完全匹配$
字符串末尾
这是你在问题~'''(.+)'.pdf~
中的模式。你的模式问题是.+
。因为它意味着一个或多个字符(每个字符甚至是'
)。因此,您的模式匹配字符串开头的两个反斜杠,其余的反斜杠将匹配为每个字符的(.+
)。
为了避免这种情况,您必须使用'w
,这意味着任何字母、数字或下划线。在这种情况下,匹配的部分将仅为test
。
您的正则表达式几乎是正确的。唯一的问题是它匹配最后一个单词中的每一种类型的字符。将其更改为
~''''([^'']+)'.pdf~
这将匹配除最后一个单词中的'
之外的所有内容,并且您应该只获得文件名。
问候
从C:''wamp''www''callCenter''joomlatools-files''docman-files''test.pdf
获取test
:
(?<='''')[^.'']+(?='.[^.'']+$)
演示
你可以通过使用一个组来获得所需的部分来避免环视:
''''([^.'']+)'.[^.'']+$
<?php
$subject = 'C:''''wamp''''www''''callCenter''''joomlatools-files''''docman-files''''test.pdf';
echo $subject; // C:''wamp''www''callCenter''joomlatools-files''docman-files''test.pdf
preg_match_all('~''''''''([^'''']+)'.pdf$~', $subject, $match);
var_dump($match);
结果
array (size=2)
0 =>
array (size=1)
0 => string '''test.pdf' (length=10)
1 =>
array (size=1)
0 => string 'test' (length=4)
如果你想匹配一个双反斜杠,你需要在正则表达式中有8个反斜杠。在第一级中,对脚本行中输入的字符串进行解析,并将反斜杠视为转义以下字符的元字符。结果,正则表达式中保留了4个斜杠。执行regex时,反斜杠和元字符一样被处理,因此仍有2个斜杠需要与主题字符串进行比较。
echo '~''''''''([^'''']+)'.pdf$~'; // ~''''([^'']+)'.pdf$~