Регулярное выражение PHP для соответствия строкам, начинающимся со специального символа

У меня есть текстовый файл с некоторым значением конфигурации. Там комментарий начинается С# Я пытаюсь найти шаблон регулярного выражения, который обнаружит все строки, начинающиеся С#

Итак, файл образца:

1st line
#test line this 
line #new line
aaaa #aaaa
bbbbbbbbbbb#
cccccccccccc
#ddddddddd

Я хочу найти

#test line this 
#ddddddddd

потому что только эти две строки начинаются С# Я попробовал следующий код:

preg_match_all("/^#(.*)$/siU",$text,$m);
var_dump($m);

Но он всегда выводит пустой массив. Кто может помочь?

Ответ 1

Вы забыли многострочный модификатор (и вам не следует использовать модификатор Singleline, также не нужен модификатор без учета регистра, а также модификатор ungreedy):

preg_match_all("/^#(.*)$/m",$text,$m);

Объяснение:

  • /m позволяет ^ и $ соответствовать в начале/конце строк, а не только всей строке (которая вам нужна здесь)
  • /s позволяет точке совпадать с новыми строками (которые вы здесь не хотите)
  • /i включает нечувствительное к регистру сопоставление (которое вам здесь не нужно)
  • /U включает неровное соответствие (что здесь не имеет значения из-за anchors)

A Демо-версия PHP:

$text = "1st line\n#test line this \nline #new line\naaaa #aaaa\nbbbbbbbbbbb#\ncccccccccccc\n#ddddddddd"; 
preg_match_all("/^#(.*)$/m",$text,$m);
print_r($m[0]);

Результаты:

[0] => #test line this 
[1] => #ddddddddd

Ответ 2

Вы можете просто написать:

preg_match_all('~^#.*~m', $text, $m);

поскольку квантификатор по умолчанию жадный и точка по умолчанию не соответствует новым строкам, вы получите то, что хотите.