我有一个混合了 HTML 的 php 页面。一些示例代码:
<?php echo "<p>some text</p>"; ?>/* <? some php in comments ?> */
<p>some HTML text</p> <!-- <h1>some HTML in comments</h1> -->
<? $header_info = <<<END
\$some="<?php @ob_start(); @session_set_save_handler(); ?>";
END; ?>
<h2>Some more HTML</h2>
我想在每个 PHP 和 HTML 标记处进行拆分,但保留引号或注释中的任何 PHP 标记或 HTML 标记不变/忽略。这是我目前所拥有的:
$array = preg_split("/((^<\?php)|([^'|\"]<\?php)|([^'|\"]<\?)|([^'|\"]\?>)|(<\%)|(\%>))/i", $string, -1);
我遇到的问题是在最后的 $array 中缺少一些 HTML 右括号 '>'。我想保持 HTML 打开和关闭标签完好无损。有时我以
<p></p instead of <p></p>
它应该是这样的:
[0] echo "<p>some text</p>";
[1] <p>some HTML text</p>
[2] $header_info = <<<END
\$some="<?php @ob_start(); @session_set_save_handler(); ?>";
END;
[3] <h2>Some more HTML</h2>
任何注释都不需要是数组的一部分,只要 preg_split 不将它们视为任何定界符并忽略它们中的任何一个即可。
我也刚刚意识到一些 php 标签,尤其是在使用 eval() 时可能会像这样结束:
"?> <p>some HTML text</p> <?";
这意味着我的正则表达式中的引号与任何这些情况都不匹配。
Preg_match() 可能是更好的选择,但不确定。
任何帮助将不胜感激,因为我在正则表达式方面不是很聪明,而且在这一点上相当卡住。
非常感谢:)
最佳答案
序言
由于询问了正则表达式解决方案,因此以下解决方案将依赖于正则表达式。但是,在这种特殊情况下,PHP 解析器会更适合。
正则表达式
#(?<!"|\')<\\?(?:php)?\\s+(.+?)\\?>(?!"|\')|/\*.+\*/|<!--.+-->#is
小脚本
$subject = '<?php echo "<p>some text</p>"; ?>/* <? some php in comments ?> */
<p>some HTML text</p> <!-- <h1>some HTML in comments</h1> -->
<? $header_info = <<<END
\\$some="<?php @ob_start(); @session_set_save_handler(); ?>";
END; ?>
<h2>Some more HTML</h2>';
$returnValue = preg_replace('#(?<!"|\')<\\?(?:php)?\\s+(.+?)\\?>(?!"|\')|/\*.+\*/|<!--.+-->#is', '$1', $subject, -1);
var_dump(preg_split('#\\r?\\n#s', $returnValue));
结果
array(6) {
[0]=>
string(25) "echo "<p>some text</p>"; "
[1]=>
string(22) "<p>some HTML text</p> "
[2]=>
string(21) "$header_info = <<<END"
[3]=>
string(60) "\$some="<?php @ob_start(); @session_set_save_handler(); ?>";"
[4]=>
string(5) "END; "
[5]=>
string(23) "<h2>Some more HTML</h2>"
}
演示
http://sandbox.onlinephpfunctions.com/code/017a51877b50f272f151feade7b59e142757481e
讨论
1. #
2. (?<!"|\')
3. <\\?(?:php)?\\s+
4. (.+?)
5. \\?>
6. (?!"|\')
7. |/\*.+\*/
8. |<!--.+-->
9. #is
第 1 行 我使用这个正则表达式定界符,因为它可以避免/
的转义
第 2 行 这是正则表达式的键。 negative lookbehind 用于确保下一个开始的 php 标记前面没有任何单引号或双引号。
第 3 行 这里定义了一个开始的 php 标签。为了也支持 ASP 标签,可以像这样更改此行:<\\?(?:php|%)?\\s+
第 4 行 因为我们已经检测到 php 代码序列的开始,所以我们匹配出现在这个 php 代码序列中的任何字符。注意第 9 行,我们使用 s标志以指示我们在 php 代码序列中也需要换行。
第 5 行 我们标记 php 代码序列的结束。
第 6 行 我们确保前面匹配的 php 标记后面没有任何带有negative lookahead断言的单引号/双引号。
第 7,8 行 如果我们发现一些 php/HTML 注释,它们将被简单地忽略。
第 9 行结束 f 正则表达式。
已知问题
$subject 上执行正则表达式后,这些行只是用换行符(前面有一个可选的回车符)分隔符分隔。关于php - preg_split 混合 HTML 和 PHP 标记,引号和注释除外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13621145/
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我正在使用ruby1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这
所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择
我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.
我正在学习http://ruby.railstutorial.org/chapters/static-pages上的RubyonRails教程并遇到以下错误StaticPagesHomepageshouldhavethecontent'SampleApp'Failure/Error:page.shouldhave_content('SampleApp')Capybara::ElementNotFound:Unabletofindxpath"/html"#(eval):2:in`text'#./spec/requests/static_pages_spec.rb:7:in`(root)'
在Ruby1.9.3(可能还有更早的版本,不确定)中,我试图弄清楚为什么Ruby的String#split方法会给我某些结果。我得到的结果似乎与我的预期相反。这是一个例子:"abcabc".split("b")#=>["a","ca","c"]"abcabc".split("a")#=>["","bc","bc"]"abcabc".split("c")#=>["ab","ab"]在这里,第一个示例返回的正是我所期望的。但在第二个示例中,我很困惑为什么#split返回零长度字符串作为返回数组的第一个值。这是什么原因呢?这是我所期望的:"abcabc".split("a")#=>["bc"
我正在尝试将一个简单的CSV文件读入HTML表格以在浏览器中显示,但我遇到了麻烦。这就是我正在尝试的:Controller:defshow@csv=CSV.open("file.csv",:headers=>true)end查看:输出:NameStartDateEndDateQuantityPostalCode基本上我只获取标题,而不会读取和呈现CSV正文。 最佳答案 这最终成为最终解决方案:Controller:defshow#OpenaCSVfile,andthenreaditintoaCSV::Tableobjectforda
我想用Nokogiri解析HTML页面。页面的一部分有一个表,它没有使用任何特定的ID。是否可以提取如下内容:Today,3,455,34Today,1,1300,3664Today,10,100000,3444,Yesterday,3454,5656,3Yesterday,3545,1000,10Yesterday,3411,36223,15来自这个HTML:TodayYesterdayQntySizeLengthLengthSizeQnty345534345456563113003664354510001010100000344434113622315