在PHP

时间:2017-07-31 14:53:08

标签: php python dictionary escaping

我正在尝试通过网站(PHP)提交用户的输入,并将他们键入的内容放入Python程序中的字典中。我现在设置它的方式是,例如,有人将“John Smith”提交到网站上的“Name”字段,点击提交,并将其名称保存在我的Python字典中'Name': 'John Smith'我和其他地方一起工作。那部分工作正常。

我遇到麻烦的地方是用户需要在某些文本字段中提交完整的段落。我的Python程序将段落之间的任何硬返回/中断解释为字典值的结尾,然后由于段落的下一位没有格式化为键:值对,整个程序崩溃。

当用户通过在PHP中搜索并替换"'" "\\'"时,我能够解决类似的问题,当用户提交了撇号(程序再次读取它时,就像值的结尾一样)在它甚至触及我的Python脚本之前,它已经被放入字典时已经正确地转义了。

我无法弄清楚如何用硬回报做同样的事情。我已经尝试搜索"\r""\\r",并试图找到CRLF以及我可以找到的关于可能在PHP,并尝试用"\\n\\n"替换所有这些,但没有一个有效。

我应该注意到,当我在手册中输入完整的段落,在行之间使用\n\n时,程序运行正常。

考虑到除了我在上面使用的名称字段示例之外的每个用户提交几乎都包含段落之间的硬回车,这是一个非常大的问题,打破了整个程序。任何想法将不胜感激!

已编辑添加:

根据要求,我正在编辑我的问题以添加一些代码示例。

当用户在网站上的文本框中输入一些文本时,该过程开始。例如:

Product Description:  "This product blah blah blah blah.

Blah blah blah blah for a few paragraphs with hard returns in between them."  

当用户点击网站上的提交时,此文本框的内容将保存到PHP变量中,并且该变量的内容将通过电子邮件发送给我。因此,对于上面的例子,我会得到一个完全按照我在上面输入的格式化的电子邮件,并且段落之间的回报很难。

对于用户没有返回的文本框,例如上面的'Name' : 'John Smith',将这个漏斗直接放入我的Python字典作为键:值对是一件容易的事。

我想要的是让我的字典看起来像这样:

dict = {
'Name': 'John Smith',
'Product Description': 'This product blah blah blah blah.\n\nBlah blah blah blah for a few paragraphs with hard returns in between them.'
}

实际发生的是:

    dict = {
        'Name': 'John Smith',
        'Product Description': 'This product blah blah blah blah.'
        'Blah blah blah blah for a few paragraphs with hard returns in between them.'
}

这显然是错误,因为“Blah等等等等等等等,并且在他们之间有很多回报。”不是关键:价值对。

早些时候,当用户在文本字段中输入撇号时,我遇到了同样的问题。例如:

Product Name: "John's Book of Recipes"

然后会显示为

'Product Name': 'John'
's Book of Recipes'

由于同样的原因而出错 - “食谱之书”不是关键:价值对。

我可以通过将这一行放在网站的PHP中来轻松解决这个问题:

$Product_Name = str_replace("'", "\\'", "$Product_Name");

在将"'"发送给我或发送到我的Python词典之前,将"\\'替换为正确转义的dict = { 'Name': 'John Smith' 'Product Name': 'John\'s Book of Recipes' } “。

这很有效。现在我的字典显示为:

$Product_Description = str_replace("\r", "\\n\\n", "$Product_Description");

所以现在我的问题是,当用户提交段落之间的回复文本时,有没有办法搜索和替换特定的字符/代码?

我尝试过,类似于上面的内容:

{{1}}

以及我在编辑之前提到的其他尝试,我认为我可以搜索PHP保存那些硬回车的任何内容(显然不是“\ r”)并将其替换为“\ n \ n”,即我知道在我的Python代码中工作,因为到目前为止我一直在手动输入它。

希望更清楚。如果没有,请告诉我,我会再次编辑。

1 个答案:

答案 0 :(得分:0)

从WikiPedia

获取的某些类型的行终止
https://en.wikipedia.org/wiki/Newline
LF:    Unix and Unix-like systems (Linux, macOS, FreeBSD, Multics, AIX, Xenix, etc.), BeOS, Amiga, RISC OS, and others[1]

CR+LF: Microsoft Windows, DOS (MS-DOS, PC DOS, etc.), DEC TOPS-10, RT-11, CP/M, MP/M, Atari TOS, OS/2, Symbian OS, Palm OS, Amstrad CPC, and most other early non-Unix and non-IBM operating systems

CR:    Commodore 8-bit machines, Acorn BBC, ZX Spectrum, TRS-80, Apple II family, Oberon, the classic Mac OS up to version 9, MIT Lisp Machine and OS-9

RS:    QNX pre-POSIX implementation

0x9B:  Atari 8-bit machines using ATASCII variant of ASCII (155 in decimal)

LF+CR: Acorn BBC and RISC OS spooled text output.
The Unicode standard defines a number of characters that conforming applications should recognize as line terminators:[5]
 LF:    Line Feed, U+000A
 VT:    Vertical Tab, U+000B
 FF:    Form Feed, U+000C
 CR:    Carriage Return, U+000D
 CR+LF: CR (U+000D) followed by LF (U+000A)
 NEL:   Next Line, U+0085
 LS:    Line Separator, U+2028
 PS:    Paragraph Separator, U+2029