php - 字符串中的正则表达式额外空格不在双引号或单引号中 - PHP

标签 php regex

我想用一个空格替换额外的空格(连续空白字符的实例),只要这些额外的空格不在双引号或单引号(或我可能想要包括的任何其他附件)中。

我看到了一些类似的问题,但在上面找不到直接满足我需求的答案。谢谢!

最佳答案

希望您还在寻找,或回来查看!这似乎对我有用:

'/\s+((["\']).*?(?=\2)\2)|\s\s+/'

...并替换为 $1

编辑

此外,如果您需要允许转义引号,例如 \"\',您可以使用此表达式:

 '/\s+((["\'])(\\\\\2|(?!\2).)*?(?=\2)\2)|\s\s+/'

如果您想添加对“平衡”引号(例如方括号)的支持(例如 (){})

结束编辑

如果您发现问题或需要一些解释,请告诉我!


希望是最终编辑和警告

  • 潜在问题:如果带引号的字符串从字符串变量(或文件)的开头开始,它要么不算作带引号的字符串(并减少了任何空格),要么会丢掉整个东西,使任何东西NOT 在引号中被视为好像在引号中,反之亦然 -
    • 可能解决这个问题的潜在更改是使用以下匹配表达式
    • /(?:^|\s+)((["\'])(\\\\\2|(?!\2).)*?(?=\2)\2) |\s\s+/
    • 这会将表达式开头的 \s+ 替换为 (?:^|\s+)
    • 这将在变量的开头添加一个空格如果字符串以引号开头 - 只需 trim() 或删除该空格以继续
  • 我似乎使用了“逐行”方法(如 sed,如果我没记错的话)来达到我的原始结果 - 如果您使用“整个文件”或“整个字符串”设置或方法,回车-return-line-feed 似乎算作两个空白字符(无法想象为什么......),从而将任何换行符变成单个空格(除非它们在引号内并且使用“点匹配换行符”,当然)
    • 这可以通过将 .\s 速记字符类替换为您要匹配的特定字符来解决,如下所示:
    • /(?:^|[\t]+)((["\'])(\\\\\2|(?!\2)[\s\S])*?( ?=\2)\2)|[\t]{2,}/
    • 这不需要 dot-matches-newline 开关,只替换多个空格或制表符 - 不是换行符 - 用一个空格(当然,只有当他们没有被引用)

示例

This link显示了在 http://codepad.viper-7.com 上的示例文本中使用的第一个表达式和最后一个表达式的示例

关于php - 字符串中的正则表达式额外空格不在双引号或单引号中 - PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10074512/

相关文章:

php - 使用 PHP 提取 HTML 文档的正文

regex - zsh grep 模式匹配 ^ 不起作用

php - 在 gmail 中使用 php 的 swiftmailer

php - 实时统计多个表中的记录

php - $ videoFeed = $ yt-> getUserUploads使脚本死亡

php - Codeigniter - 日期格式 - 表单验证

PHP MySQL 删除数量

python - 用于提取标签及其内容的正则表达式模式

javascript - 如何在javascript中的匹配函数中传递变量?

javascript - 用于验证范围内的十进制值的正则表达式是什么 - 0 到 99999.00