Давайте напишем файл с помощью редактора Windows (таким образом, генерируя символ конца строки, отличный от Unix, вероятно):
TITLE:Hello
URL:hello.html
AUTHOR:Bob
затем
content = file_get_contents($page);
preg_match("/^URL:(.*)$/m", $content, $matches);
echo $matches[1] . '#test';
возвращается
hello.html
#test
вместо
hello.html#test
Я могу решить проблему, выполнив View > Line Endings > Unix
и сохраните с помощью Sublime Text.
Но как предотвратить появление этого дополнительного пространства независимо от того, какой текстовый редактор / платформу я использую?
Вы могли бы сделать:
preg_match("/^URL:(\S+)/", $content, $matches);
\S+
соответствует как минимум одному символу, который не является пробелом URL не содержит пробелов, поэтому в группе 1 у вас есть URL без пробелов в конце.
Если строка, которую вы хотите сопоставить, имеет пробелы в середине:
preg_match("/^URL:(.+?)\s*$/", $content, $matches);
Несколько возможностей:
1) вы можете использовать не жадный квантификатор с последующим дополнительным возвратом каретки:
/^URL:(.*?)\r?$/m
2) вы можете более четко описать группу захвата так, чтобы она не заканчивалась символом пробела:
/^URL:\h*(\S+(?:\h+\S+)*)/m
\h
класс символов для горизонтальных пробелов