用preg_replace替换alt attriute?

时间:2015-06-10 04:27:18

标签: php regex

我想使用preg_replace删除alt属性。这是alt属性

的模式
alt="Screen Shot 2015-06-09 at 11.37.40 AM"

或者可能是这样的

alt="The Postmates sign outside the office"

引号内可以有任何字符。我正在使用以下表达式:

$html = preg_replace('/alt="\w+\s\w+"/', '><br>', $html);

但它只替换了类型的alt属性:

alt="The Postmates"

这里适当的表达方式是什么?

2 个答案:

答案 0 :(得分:2)

class function UTIL.ProcessString(const S: string): string; var SB: TStringBuilder; P: PChar; Ch: Char; begin Result := ''; P := PChar(S); if P^ = #0 then Exit; SB := TStringBuilder.Create; try repeat Ch := P^; Inc(P); if Ch <> '\' then SB.Append(Ch) else begin Ch := P^; if Ch = #0 then begin // up to you if you really need this or not: // SB.Append(sLineBreak); Break; end; Inc(P); case Ch of '\','"': SB.Append(Ch); 'n': SB.Append(sLineBreak); 't': SB.Append(#9); else SB.Append('\'+Ch); end; end; until P^ = #0; Result := SB.ToString; finally SB.Free; end; end; 应该这样做。

.*?

这将使用$html = preg_replace('/alt=".*?"/', '<br>', $html); 替换alt属性及其内容中的所有内容。

旁注<br>元素中的<br>如果你正在做的事情没有多大意义......或者因为你有img可能你试图关闭><br>img始终是最后一个属性吗?

alt说找到任何东西,直到第一个“这个字符”,在这种情况下是双引号....更多细节......

.*? =任何角色

. =前一个字符出现0次或更多次(如果您想要至少出现一次,则替换为*

+ =使?懒惰,意味着在第一次出现时停止,而不是最后一次出现

测试正则表达式的地方。 http://regex101.comhttp://www.phpliveregex.com/

学习正则表达式的地方,http://www.rexegg.com/http://www.regular-expressions.info/以及许多其他网站。

这是一个测试,您可以看到此正则表达式与http://www.phpliveregex.com/p/bvn一起使用。

根据您的更新:

*

$html = preg_replace('/alt=".*?"\s*/\?s*>/', '><br>', $html); 是为了逃避正斜杠,因为正斜杠是你的分隔符。正斜杠后的/\是因为它是可选的。 ?是零或更多的空格。那些可以在可选的前向斜线的两侧,这就是为什么我们都有这两个斜杠。

答案 1 :(得分:0)

我不确定PHP中的regexp有何不同,但试试这个:

$html = preg_replace('~alt\s*=\s*"([^"]*)"~', '><br>', $html);

一开始我们有 alt 这是一个纯文本 然后 \ s * 表示&#34;零个或多个空格&#34;。这样做是为了处理像alt = "something"这样的代码 = 代表一个简单的等号 再次 \ s * ([^&#34;] *)表示&#34;除引号外的任何符号。