如果字符串是PHP中的正则表达式或普通字符串,是否有一种好的测试方法?
理想情况下,我想编写一个函数来运行字符串,返回true或false.
我看了看preg_last_error():
<?php
preg_match('/[a-z]/', 'test');
var_dump(preg_last_error());
preg_match('invalid regex', 'test');
var_dump(preg_last_error());
?>
Run Code Online (Sandbox Code Playgroud)
显然,第一个不是错误,第二个是错误.但两次preg_last_error()返回int 0.
有任何想法吗?
我试图在看起来像一个空字符的东西上爆炸一个字符串.
这就是我正在使用的:$exp = explode('\x00', $bin);.
虽然这不起作用.但是,如果我这样做$exp = explode($bin[5], $bin);($bin这个角色我想要爆炸的角色5 )它可以正常工作.
如果我这样做var_dump($bin[5])它向我显示带有问号的方块( ),并在视图源中我得到:&#0;
谁能告诉我爆炸这个角色最好的方法是什么?或者即使它是空字符(根据ascii表格,除非我读错了).
谢谢
我目前正在尝试学习Symfony2并尝试设置它.Symfony2中有一个framework.ide设置,允许在IDE中打开控制器和操作.
我目前正在使用PhpStorm和Remote Call.我已经想出如何在Linux环境中使用它,但是,在Windows中,由于Windows使用向后斜杠(JavaScript似乎逃脱了),因此不希望它工作.
我当前的配置如下所示:
config_dev.yml
framework:
ide: 'javascript: var r = new XMLHttpRequest; r.open("get", "http://localhost:8091?message=%%f:%%l");r.send()'
Run Code Online (Sandbox Code Playgroud)
这使调试器的操作名称链接到:
javascript: var r = new XMLHttpRequest; r.open("get", "http://localhost:8091?message=C:\Users\Hosh\vhosts\symfony\src\Acme\DemoBundle\Controller\WelcomeController.php:9");r.send()
Run Code Online (Sandbox Code Playgroud)
这很好,但是,JavaScript似乎将文件路径视为:
javascript: var r = new XMLHttpRequest; r.open("get", "http://localhost:8091?message=C:UsersUservhostssymfonysrcAcmeDemoBundleControllerWelcomeController.php:9");r.send()
Run Code Online (Sandbox Code Playgroud)
我目前的解决方案是覆盖模板WebProfileBundle:Collector:request.html.twig并通过替换过滤器手动运行链接,以便:
7. <span class="sf-toolbar-info-class sf-toolbar-info-with-next-pointer">{{ collector.controller.class|abbr_class }}</span>
8. <span class="sf-toolbar-info-method" onclick="{% if link %}window.location='{{link}}';window.event.stopPropagation();return false;{% endif %}">
9. {{ collector.controller.method }}
10. </span>
Run Code Online (Sandbox Code Playgroud)
变为:
7. <span class="sf-toolbar-info-class sf-toolbar-info-with-next-pointer">{{ collector.controller.class|abbr_class }}</span>
8. <span class="sf-toolbar-info-method" onclick="{% if link %}{{ link|replace({'\\': '/'}) }}{% endif %}">
9. {{ collector.controller.method …Run Code Online (Sandbox Code Playgroud) 如果我使用用户定义的输入字符串在我的服务器上运行用户定义的正则表达式,是否存在任何安全问题?我不是要问一种语言,而是任何语言,PHP是我想要了解的主要语言之一.
例如,如果我有以下代码:
<?php
if(isset($_POST['regex'])) {
preg_match($_POST['regex'], $_POST['match'], $matches);
var_dump($matches);
}
?>
<form action="" method="post">
<input type="text" name="regex">
<textarea name="match"></textarea>
<input type="submit">
</form>
Run Code Online (Sandbox Code Playgroud)
提供这不是受控环境(即用户不可信任),上述代码的风险是什么?如果为其他语言编写类似的代码,这些其他语言是否存在风险?如果是这样,哪些语言包含威胁?
我已经发现了'邪恶的正则表达式',然而,无论我在我的电脑上尝试什么,它们似乎工作正常,见下文.
PHP
<?php
php > preg_match('/^((ab)*)+$/', 'ababab', $matches);var_dump($matches);
array(3) {
[0] =>
string(6) "ababab"
[1] =>
string(0) ""
[2] =>
string(2) "ab"
}
php > preg_match('/^((ab)*)+$/', 'abababa', $matches);var_dump($matches);
array(0) {
}
Run Code Online (Sandbox Code Playgroud)
JavaScript的
phantomjs> /^((ab)*)+$/g.exec('ababab');
{
"0": "ababab",
"1": "ababab",
"2": "ab",
"index": 0,
"input": "ababab"
}
phantomjs> /^((ab)*)+$/g.exec('abababa');
null
Run Code Online (Sandbox Code Playgroud)
这让我相信PHP和JavaScript具有邪恶正则表达式的故障安全机制.基于此,我希望其他语言具有相似的功能.
这是正确的假设吗?
最后,对于任何或所有可能有害的语言,有没有办法确保正则表达式不会造成损害?
今天早些时候我正在开发一个PHP 5.3+应用程序,这意味着我可以自由使用PHP闭包.太棒了,我想!然后我遇到了一段代码,其中使用功能性PHP代码会使事情变得更容易,但是,虽然我有一个合乎逻辑的答案,但它让我想知道直接调用封闭内容array_map()和传递它之间的性能影响是什么作为一个变量.即以下两个:
$test_array = array('test', 'test', 'test', 'test', 'test' );
array_map( function ( $item ) { return $item; }, $test_array );
Run Code Online (Sandbox Code Playgroud)
和
$test_array = array('test', 'test', 'test', 'test', 'test' );
$fn = function ( $item ) { return $item; };
array_map( $fn, $test_array );
Run Code Online (Sandbox Code Playgroud)
正如我所想,后者确实更快,但差别并不大.实际上,重复这些相同的测试10000次并取平均值的差异为0.05秒.甚至可能是侥幸.
这让我更加好奇.怎么样create_function()和关闭?同样,经验告诉我,create_function()当它array_map()创建一个函数,评估它,然后存储它时,它应该更慢.而且,正如我所想的那样,create_function()确实更慢.这就是全部array_map().
然后,我不知道为什么我这样做,但是我做了,我检查了create_function()保存它之间的差异和闭包之间的区别.没有处理,没有任何东西,只是简单地传递一个字符串,并返回该字符串.
测试成了:
$fn = function($item) { return $item; };
$fn('test');
Run Code Online (Sandbox Code Playgroud)
和
$fn = create_function( '$item', 'return $item;' );
$fn('test');
Run Code Online (Sandbox Code Playgroud)
我分别运行了10000次这些测试,并查看了结果并获得了平均值.我对结果感到非常惊讶. …
我有以下动画:
$('#id').animate({'margin-top': 100, 'margin-left': 100}, {queue: false, duration: 1000});
$('#id2').fadeTo(1000, 1);
Run Code Online (Sandbox Code Playgroud)
这似乎是排队,我怎样才能确保fadeTo()不排队?
我已经设置了一个观察者,catalog_product_collection_load_after并调用以下代码:
<?php
class Drench_Admindetails_Model_Observer {
public function loadAfter($observer){
$collection = $observer->getEvent()->getCollection();
$collection->addAttributeToFilter('admin_id', Mage::getSingleton('admin/session')->getUser()->getUserId());
foreach($collection as $item) {
fb($item->getAdminId()); //fb() is a firebug call
}
return $this;
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在过滤集合admin_id,我通过以下安装脚本(namespace/module/Resource/Eav/Mysql4/Setup.php)创建了集合.
<?php
class Drench_Admindetails_Resource_Eav_Mysql4_Setup extends Mage_Eav_Model_Entity_Setup
{
public function getDefaultEntities()
{
return array(
'catalog_product' => array (
'entity_model' => 'catalog/product',
'attribute_model' => 'catalog/resource_eav_attribute',
'table' => 'catalog/product',
'additional_attribute_table' => 'catalog/eav_attribute',
'entity_attribute_collection' => 'catalog/product_attribute_collection',
'attributes' => array (
'admin_id' => array (
'group' => '',
'label' => '',
'type' => …Run Code Online (Sandbox Code Playgroud) 我需要检查一个字符串是否有自己的等号.我现在的正则表达式似乎在Java中不起作用,即使RegexPal匹配它.
我目前的代码是:
String str = "test=tests";
System.out.println(str + " - " + str.matches("[^=]=[^=]"));
Run Code Online (Sandbox Code Playgroud)
在以下测试用例中,第一个应匹配,第二个不应:
test=tests // matches t=t
test==tests // doesn't match
Run Code Online (Sandbox Code Playgroud)
Regex Pal做得对,但是,由于某些原因,Java在两个测试用例中都返回false.我在某个地方出错了吗?
谢谢!
我下面有一个代码片段,我不太清楚最后一行是做什么的.更具体地说是什么是Bytef []?
FILE* read_file_handle = fopen(read_filename, "rb");
fseek(read_file_handle, 0, SEEK_END);
size_t no_bytes_to_read = ftell(read_file_handle);
Bytef* read_buffer = new Bytef[no_bytes_to_read];
Run Code Online (Sandbox Code Playgroud)
什么是Bytef []呢?并且,如果有人知道,当将其移植到PHP时,我该怎么做?我认为它可能是一个数组,但是从未定义过这样的变量,并且使用new关键字它就没有意义了.
有人可以帮忙吗?
Hosh
编辑:好的,所以感谢用户默认它似乎是在zlib中定义的东西.它的定义是typedef Byte FAR Bytef;在上线124文件
任何人都知道Bytef的类型是根据是什么?字节已被定义为char(typedef unsigned char Byte;)和FAR已定义:#define FAR
任何帮助?
我试图使用 HTTPClient 来获取页面,但它似乎返回乱码(我认为是二进制)。
这是我的代码:
public Boolean getPage(String url, String referer) {
httpClient.getParams().setParameter("http.protocol.version", HttpVersion.HTTP_1_1);
httpClient.getParams().setParameter("http.socket.timeout", new Integer(1000));
httpClient.getParams().setParameter("http.protocol.content-charset", "UTF-8");
HttpGet httpGet = new HttpGet(url);
response = null;
httpGet.setHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3");
httpGet.setHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
httpGet.setHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
httpGet.setHeader("Accept-Encoding", "gzip,deflate");
httpGet.setHeader("Referer", referer);
int tryNumber = 0;
while(tryNumber<5){
tryNumber++;
try {
ResponseHandler<String> responseHandler = new BasicResponseHandler();
ret = httpClient.execute(httpGet,responseHandler).toString();
Log.v("Info:", ret);
}
catch(Exception e) {
error = e;
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
谁能指出我哪里出错了?
我正在尝试获取此页面的内容: http: //hosh.me.uk/test.php
php ×5
regex ×3
android ×1
c++ ×1
closures ×1
explode ×1
hex ×1
httpclient ×1
java ×1
javascript ×1
jquery ×1
magento ×1
magento-1.5 ×1
performance ×1
perl ×1
preg-match ×1
queuing ×1
string ×1
symfony ×1