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"
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.