我正在为PHP编写C ++扩展,我在代码中使用了正则表达式。这是一个片段
#include <phpcpp.h>
#include <regex>
#include <iterator>
#include <iostream>
#include <sstream>
#include <string>
#include <fstream>
#include <stdio.h>
using namespace std;
Element* parse(std::sregex_iterator iterator, std::sregex_iterator iteratorEnd)
{
string segmentContent = "";
// Segment* segment = nullptr;
while (iterator != iteratorEnd)
{
// segment = readSegment(iterator->str());
++iterator;
}
return nullptr;
};
Php::Value parseFromFile(Php::Parameters ¶ms)
{
string filePath = params[0];
ifstream file(filePath);
if (!file.is_open())
{
return nullptr;
}
else
{
// Read the file into a buffer
stringstream buffer;
buffer << file.rdbuf();
// We now have the buffer so we can close the file
file.close();
string regexPattern = string("some pattern here");
std::regex regexMatcher(regexPattern, regex_constants::icase);
string fileContents = buffer.str();
std::sregex_iterator iterator(fileContents.begin(), fileContents.end(), regexMatcher);
std::sregex_iterator iteratorEnd;
root = parseXml(iterator, iteratorEnd);
return Php::Object("SmartXmlParser\\XmlElement", root);
}
};
这不会编译,因为我还没有包含代码的所有部分(有很多。)这一切都很好地编译在这里,没有任何错误或警告。当我尝试运行一个使用此C ++代码中的任何内容的测试php文件时,它只是没有给出以下错误。
PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php5/20131226/myextension.so' - /usr/lib/php5/20131226/myextension.so: undefined symbol: _ZNSt14regex_iteratorIN9__gnu_cxx17__normal_iteratorIPKcSsEEcSt12regex_traitsIcEEC1Ev in Unknown on line 0
PHP Fatal error: Call to undefined function parseXml() in /home/vagrant/Laravel/extensions/myextension/test.php on line 5
PHP Stack trace:
PHP 1. {main}() /home/vagrant/Laravel/extensions/myextension/test.php:0
Fatal error: Call to undefined function parseXml() in /home/vagrant/Laravel/extensions/myextension/test.php on line 5
Call Stack:
0.0023 220904 1. {main}() /home/vagrant/Laravel/extensions/myextension/test.php:0
一旦我删除引用正则表达式类的方法和代码片段就可以正常运行(我可以保留包含它,它仍然可以工作。)
我使用以下命令行编译:
g++ -Wall -c -O2 -std=c++11 -fpic -o main.o main.cpp
g++ -shared -o myextension.so main.o -lphpcpp
cp -f myextension.so /usr/lib/php5/20131226
cp -f myextension.ini /etc/php5/cli/conf.d
由于正则表达式是C ++ 11中标准库的一部分,我想我不必手动链接正则表达式,因为它在运行时自动完成了吗?
我有什么东西可以让它与PHP一起使用吗?我没有暴露任何正则表达式对象,它们只是在我的C ++代码中实现目标的一种方法。
答案 0 :(得分:1)
regex
is only available from GCC version 4.9.0
请将您的gcc编译器和gcc运行时库更新到4.9.0或更高版本,以使其正常工作。
请注意,来自GCC的regex
库仍然没有错误,并且有a high-impact bug reported on StackOverflow。