我想要实现的是断言两个字符串相等,忽略格式化
$expected =
'<div class="input select">
<label for="countries">User Country</label>
<select name="countries" id="countries">
<option value="">Select a country</option>
<option value="ger">Germany</option>
<option value="fra">France</option>
<option value="rus" selected="selected">Russia</option>
</select>
</div>';
$actual = '<div class="input select"><label for="countries">User Country</label><select name="countries" id="countries"><option value="">Select a country</option><option value="ger">Germany</option><option value="fra">France</option><option value="rus" selected="selected">Russia</option></select></div>';
$this->assertTextEquals($expected, $actual);
到目前为止,我得到了这个:
public function assertTextEquals($expected, $actual)
{
$actualNoLineBreaks = preg_replace("/r|n/", "", $actual);
$actualNoLongSpaces = preg_replace('!s+!', ' ', $actualNoLineBreaks);
$expectedNoLineBreaks = preg_replace("/r|n/", "", $expected);
$expectedNoLongSpaces = preg_replace('!s+!', ' ', $expectedNoLineBreaks);
TestCase::assertEquals($expectedNoLongSpaces, $actualNoLongSpaces);
}
但问题是仍然存在换行的空间,例如:select"> <label
。
那么,去掉换行符和后面所有空格(直到第一个非空格字符)的正则表达式是什么呢?
当然,我可以从两个字符串中去掉所有空格,但这会使错误消息难以阅读,我正在寻找一个优雅的解决方案。
您可以使用
trim(preg_replace('~h*Rs*~', '', $expected))
请参阅PHP演示和regex演示详细信息:
h*
-零个或多个水平空白(制表符、空格…)R
-任意换行符字符(序列)s*
-和任何零个或多个空白字符
trim()
函数删除前导/尾随空白。
检查此项:
(( *n+|A) *)
A
将删除字符串开头的任何空格。
演示