1行に有効な引用符で囲まれた部分文字列が1つしかない場合、これは適切な開始点になる可能性があります。
<?php // test.php Rev:20120105_1800
// Return array of valid quoted substrings, one per line.
function getArrayOfOnePerLineValidQuotedSubstrings($text) {
$re = '%
# Match line w/1 valid "single" or "double" substring.
^ # Anchor to start of line.
[^\'"]* # Everything up to first quote.
(?| # Branch reset group $1: Contents.
"([^"]*)" # Either $1.1 Double quoted,
| \'([^\']*)\' # or $1.2 Single quoted contents.
) # End $1: branch reset group.
[^\'"]* # Everything after quoted sub-string.
$ # Anchor to end of line.
%xm';
if (preg_match_all($re, $text, $matches)) {
return $matches[1];
}
return array();
}
// Fetch test data from file.
$data = file_get_contents('testdata.txt');
// Get array of valid quoted substrings, one per line.
$output = getArrayOfOnePerLineValidQuotedSubstrings($data);
// Display results.
$count = count($output);
printf("%d matches found.\n", $count);
for ($i = 0; $i < $count; ++$i) {
printf(" match[%d] = {%s}\n", $i + 1, $output[$i]);
}
?>
この正規表現は、1つの有効な引用符付き部分文字列を含む各行に一致し、無効な(つまり"--'__'--、不均衡な二重引用符付き部分文字列がある)または引用符付き部分文字列がない行をスキップします。一致する行の場合、有効な引用符で囲まれた部分文字列の内容がグループに返され$1ます。この関数は、一致した部分文字列の配列を返します。
データに1行に複数の部分文字列が含まれる場合、または引用符で囲まれた部分文字列または引用符で囲まれた部分文字列の間にエスケープされた引用符が含まれる場合は、より複雑なソリューションが定式化される可能性があります。