搜索特定的文本字符串,然后替换该字符串

Searching for a specific string of text, then replacing the string

我有一个 PHP 文件,其内容与此类似:

<table class="select_descript" cellspacing="4" cellpadding="0" border="0" align="center" valign="middle"><tbody><tr><td>Top songs for the past week. Updated Saturday, 21 March 2015</td></tr></tbody></table>

我在里面有日期,我希望能够只用当前日期替换这个 PHP 文件中的这个日期部分。我正在考虑同时查找 valign="middle"><tbody><tr><td> 和单词 Updated 并使用 -replace 方法。

$phpfile = phpfile.php
(Get-Content $phpfile) -replace "(?<=Updated ).+","Updated (Get-Date).ToLongDateString()"

但我对这个表达方式感到困惑。

你不说文件是在什么情况下被修改的。我的第一个建议是创建一个源模板文件,其中包含当前日期所在的唯一标记。

...<td>Top songs for the past week. Updated [[DATE_HERE]]</td>...

那么替换就很简单了,而且基本上是万无一失的。

(gc template.php) -replace '[[DATE_HERE]]',(Get-Date).ToLongDateString() | sc $phpfile

对于正则表达式解决方案,您需要标识位置但最不可能更改的字符串。我不会尝试基于 HTML 标记进行解析,否则格式更改会破坏您的正则表达式。在您的示例中,我将使用整个 "Top songs ..." 文本。

$searchText = 'Top songs for the past week. Updated [^<]*'
$replaceText = "Top songs for the past week. Updated $((Get-Date).TolongDateString())"

(Get-Content $phpfile -Raw) -replace $searchText,$replaceText | Set-Content $phpfile

请注意,Get-Content-Raw 参数会导致它立即读取整个文件,然后关闭文件,这样当您将相同的文件名传递给时就不会出现错误设置内容。