仅在最后一条评论上爆炸,跳过#inside变量

A sample values like this:

fdsfsf345#3gt#$%3^#$T$#tr43r43
test spaces
"test spaces"

"fdsfsf345#3gt#$%3^#$T$#tr43r43" #comment
"test spaces" #comment

A script:

$re = '/(.*)(?:\"|\'|)(?: )#?(.*)|(.*)/mi';
preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
var_dump($matches);

A problem is that a line without '# comment' prints

A result should be on first array:

fdsfsf345#3gt#$%3^#$T$#tr43r43
test spaces
"test spaces"

"fdsfsf345#3gt#$%3^#$T$#tr43r43"
"test spaces"

https://regex101.com/r/IpcEPU/1

Given your sample input, you only need to remove substrings from space-hash to the end of the line.

Code: (Demo)

$array = [
    'bar',
    'fdsfsf345#3gt#$%3^#$T$#tr43r43',
    'test spaces',
    '"test spaces"',
    '"fdsfsf345#3gt#$%3^#$T$#tr43r43" #comment',
    'test spaces" #comment',
    'bar',
    '""',
    '""""',
    'foo1 #comment2',
    '"with space value" #comment',
    'with quote value\'',
    'somestringstart',
    'with spaces" # a comment',
    'bar'
];

$result=preg_replace('~ #.*~','',$array);
var_export($result);

If you may have space-hash substrings inside of your quoted text, then (*SKIP)(*FAIL) will help by disqualifying these values.

Pattern: '~(["']).*?\1(*SKIP)(*FAIL)| #.*~' Replace: '' (empty string)

This will ensure that single or double quote-wrapped space-hash substrings are not matched/removed.

Found a solution with regex:

/(?=(^(.*)[ ])(?=#[ a-z0-9]+))|(?=(^(.*))+)/i

It will parse only values and skip with any type comments.

https://regex101.com/r/dFVhjr/1

If have any improved idea it will be welcome.